- 日志
- 好友
- 卖家信用
- 买家信用
- 注册时间
- 2008-7-13
- 在线时间
- 小时
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册账号
x
.net类库里面有现成的画箭头的类 但是,当我想自由的控制箭头的高度,宽度的时候,它可能就不能用了
为了将来灵活画出各种高度,宽度的箭头,需要自己实现箭头的类。
矢印を描画する点を自分で計算する方法
肝は、矢印の部分の座標を計算する方法である
----プログラム抜粋-----
/******************************************************************************
*JdrArrow.h
*****************************************************************************/
#pragma once
using namespace System;
using namespace System::Drawing;
namespace DevTech
{
namespace Arrow
{
///
///2つの点で決まる直線の方向性格納
///*x軸の場合:
/// x座標がプラスの方向を正方向、逆を負方向とする
///*y軸の場合:
/// y座標プラスの方向を正方向、逆を負方向とする
///
public enum class JdrArrowDirection : char
{
NEGATIVE = -1, //負方向
POSITIVE = 0, //正方向
};
///
///直線の座標軸との平行性
///
public enum class Parallelism : char
{
DONOT_PARALLEL = 0, //座標軸と平行しない
PARALLEL_WITH_X = 1, //X軸と平行
PARALLEL_WITH_Y = 2 //y軸と平行
};
///
///直線の方向性(座標軸との平行性,各軸に沿う方向性)
///
public ref struct LineDirection
{
//座標軸との平行性
Parallelism Parallelism;
///
///線の方向
///*x軸と平行線の場合:x軸に沿う方向
/// y軸と平行線の場合:y軸に沿う方向
/// 座標軸と平行しない場合:x軸に沿う方向
///
JdrArrowDirection ArrowDirection;
};
///
///矢印を管理するクラス
///2つの点を設定されると、矢印を生成し保持する
///
public ref class JdrArrow
{
private:
PointF m_start; //起点
PointF m_end; //終点
PointF m_endTo1; //矢印の点1
PointF m_endTo2; //矢印の点2
LineDirection m_lineDirection;
//将来設定できるようにする
int m_d; //矢印の高さ
int m_d2; //矢印の幅
///
///矢印の両点を計算する
///
void getArrowPoint();
public:
///
///起点を返す
///
property PointF StartPoint
{
PointF get(){return m_start;}
}
///
///終点を返す
///
property PointF EndPoint
{
PointF get(){return m_end;}
}
///
///矢印の点を返す
///
property PointF EndTo1
{
PointF get(){return m_endTo1;}
}
///
///矢印の点を返す
///
property PointF EndTo2
{
PointF get(){return m_endTo2;}
}
///
///コンストラクタ
///起点
///終点
///
JdrArrow(PointF i_st,PointF i_ed);
};
}
}
--------------------------------------------
/******************************************************************************
*JdrArrow.cpp
*****************************************************************************/
#include "JdrArrow.h"
///
///矢印の両点を計算する
///*m_start,m_end両点で決まる直線の終点に描画する矢印の両点を計算し、
/// m_endTo1,m_endTo2に設定する
///
void DevTech::Arrow::JdrArrow::getArrowPoint()
{
//座標軸と平行する直線の矢印は簡単に計算できる
if(m_lineDirection.Parallelism==Parallelism::PARALLEL_WITH_X) //x軸と平行
{
if(m_lineDirection.ArrowDirection==JdrArrowDirection::POSITIVE) //正方向
{
m_endTo1.X = m_end.X - m_d;
m_endTo2.X = m_endTo1.X;
m_endTo1.Y = m_end.Y - m_d2;
m_endTo2.Y = m_end.Y + m_d2;
}
else //負方向
{
m_endTo1.X = m_end.X + m_d;
m_endTo2.X = m_endTo1.X;
m_endTo1.Y = m_end.Y - m_d2;
m_endTo2.Y = m_end.Y + m_d2;
}//end if
return;
}
else if(m_lineDirection.Parallelism==Parallelism::PARALLEL_WITH_Y) //y軸と平行
{
if(m_lineDirection.ArrowDirection==JdrArrowDirection::POSITIVE) //正方向
{
m_endTo1.Y = m_end.Y - m_d;
m_endTo2.Y = m_endTo1.Y;
m_endTo1.X = m_end.X + m_d2;
m_endTo2.X = m_end.X - m_d2;
}
else //負方向
{
m_endTo1.Y = m_end.Y + m_d;
m_endTo2.Y = m_endTo1.Y;
m_endTo1.X = m_end.X + m_d2;
m_endTo2.X = m_end.X - m_d2;
}//end if
return;
}//end if
//座標軸と平行しない直線の矢印の両点を計算する>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
float m1 = (m_end.Y-m_start.Y) / (m_end.X-m_start.X);
float x3 = 0;
float y3 = 0;
if(m_lineDirection.ArrowDirection==JdrArrowDirection::POSITIVE) //正方向
{
x3 = m_end.X - (float)Math::Sqrt((m_d*m_d)/(1+m1*m1));
}
else
{
x3 = m_end.X + (float)Math::Sqrt((m_d*m_d)/(1+m1*m1));
}//end if
y3 = m1 * (x3-m_end.X) + m_end.Y;
float m2 = -1 / m1;
m_endTo1.X = x3 + (float)Math::Sqrt((m_d2*m_d2)/(1+m2*m2));
m_endTo2.X = x3 - (float)Math::Sqrt((m_d2*m_d2)/(1+m2*m2));
m_endTo1.Y = m2 * (m_endTo1.X-x3) + y3;
m_endTo2.Y = m2 * (m_endTo2.X-x3) + y3;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
///
///コンストラクタ
///起点
///終点
///
DevTech::Arrow::JdrArrow::JdrArrow(PointF i_st,PointF i_ed)
{
m_start = i_st;
m_end = i_ed;
//直線の平行性・方向性を判定
if(m_end.X==m_start.X) //y軸と平行
{
m_lineDirection.Parallelism = Parallelism::PARALLEL_WITH_Y;
if(m_end.Y>=m_start.Y) //正方向
m_lineDirection.ArrowDirection = JdrArrowDirection::POSITIVE;
else //負方向
m_lineDirection.ArrowDirection = JdrArrowDirection::NEGATIVE;
}
else //y軸と平行しない
{
if(m_end.Y==m_start.Y) //x軸と平行
m_lineDirection.Parallelism = Parallelism::PARALLEL_WITH_X;
else
m_lineDirection.Parallelism = Parallelism::DONOT_PARALLEL;
if(m_end.X>=m_start.X) //正方向
m_lineDirection.ArrowDirection = JdrArrowDirection::POSITIVE;
else
m_lineDirection.ArrowDirection = JdrArrowDirection::NEGATIVE;
}//end if
//矢印の大きさはとりあえず固定値を取る(将来設定可能に)
m_d = 10; //高さ
m_d2 = 5; //幅
//矢印の両点を計算
getArrowPoint();
}
矢印を描画する点座標を計算するクラスは↑の通りである。
使い方:
JdrArrow^ pArrow = gcnew JdrArrow(start Point, end Point);
g->DrawLine(Pens::Red,m_pArrow->StartPoint,m_pArrow->EndPoint);
g->DrawLine(Pens::Red,m_pArrow->EndPoint,m_pArrow->EndTo1);
g->DrawLine(Pens::Red,m_pArrow->EndPoint,m_pArrow->EndTo2);
矢印を描画するクラス(たとえば ref class DrawXXX)を作成するのも一つの案である。
|
评分
-
查看全部评分
|