рисование стрелок в C++Builder с помощью canvas

Ответить
Аватара пользователя
TDUTY
Сообщения: 34
Зарегистрирован: 30 янв 2009, 10:20
Контактная информация:

Помогите пожалуйста научиться рисовать стрелочки в Image с помощью Canvas'а. Язык и среда разработки C++ Builder. Входные данные: координаты двух точек. x1,y1,x2,y2 рисовать стрелочку надо к x2,y2; Выходные: нарисованная стрелочка в Имэйдже. кому не лень конешно помочь...
Аватара пользователя
TDUTY
Сообщения: 34
Зарегистрирован: 30 янв 2009, 10:20
Контактная информация:

вот мои достижения: определения расстояния s по заданному направлению (координатами двух точек)

float x1,y1,x2,y2,x3,y3;
//задаем кординаты например так:
x1=StrToFloat(Form1->StringGrid1->Cells[0]);
y1=StrToFloat(Form1->StringGrid1->Cells[1]);
x2=StrToFloat(Form1->StringGrid1->Cells[2]);
y2=StrToFloat(Form1->StringGrid1->Cells[3]);

//рассчитываем a и b
float a,b;
a=y2-y1;
b=x2-x1;

float al;
//если b совпадает с нулем то угол у нас 180 градусов
if(b==0) {al=3.14;} else {al=atan(a/b);}

float a1,b1;
int kof1=1;
float shi=3;
//s - длина которую необходимо отложить
//от координат x1,y1
a1=shi*sin(al);
b1=shi*cos(al);
//как выяснилось важен знак:
if (b>0) {kof1=1;} else {kof1=-1;};
//координаты отложенного отрезка s по направлению x1,y1->x2,y2
x3=x1+kof1*b1;
y3=y1+kof1*a1;
//рисуем линию
Image1->Canvas->MoveTo(x1,y1);
Image1->Canvas->LineTo(x3,y3);
Аватара пользователя
TDUTY
Сообщения: 34
Зарегистрирован: 30 янв 2009, 10:20
Контактная информация:

Кто нить может помочь мне?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Стрелка - это треугольник. Одна вершина известна. Координаты двух других, как ни крути, придется вычислить.
Аватара пользователя
TDUTY
Сообщения: 34
Зарегистрирован: 30 янв 2009, 10:20
Контактная информация:

Naeel Maqsudov писал(а):Стрелка - это треугольник. Одна вершина известна. Координаты двух других, как ни крути, придется вычислить.

да, это я уже понял)))

Изображение

вот входные параметры это x1,y1,x2,y2,s,s1

void line1(TImage *imag1,float x1, float y1, float x2, float y2,float s, float s1)
{
float a,b,x3,y3,al,a1,b1;
//если горизонтальная или вертикальная линия
if((x1==x2)||(y1==y2))
{
float x3,y3,x4,y4,x5,y5;
if(x1==x2)
{
if(y1>y2)
{x3=x1; y3=y2+s;};
if(y2>y1)
{x3=x1; y3=y2-s;};
y4=y3; y5=y3;
x4=x3-(s1/2); x5=x3+(s1/2);
};
if(y1==y2)
{
if(x1>x2)
{y3=y1; x3=x2+s;};
if(x2>x1)
{y3=y1; x3=x2-s;};
x4=x3; x5=x3;
y4=y3-(s1/2); y5=y3+(s1/2);
};
//теперь нарисуем
TPoint points[]={
Point(x1,y1),
Point(x3,y3),
Point(x4,y4),
Point(x2,y2),
Point(x5,y5),
Point(x3,y3)};
imag1->Canvas->Pen->Color=clBlack;
imag1->Canvas->Brush->Color=clBlack;
imag1->Canvas->Polygon(points, 5);
imag1->Canvas->Brush->Color=clWhite;
return;
}
//находим x3,y3
a=y2-y1;
b=x2-x1;
if(b==0) {al=3.14;} else {al=atan(a/b);}
int kof1=1;
a1=s*sin(al);
b1=s*cos(al);
if (b>0) {kof1=-1;} else {kof1=1;};
x3=x2+kof1*b1;
y3=y2+kof1*a1;
//находим x4,y4,x5,y5
//уравнение прямой: A*x+B*y+C=0
//где A=y2-y1; B=x1-x2; C=x1*y2-x2*y1;
//Уравнение перпендикуляра из точки (x3,y3) B*x-A*y+C2=0
//где C2=A*y3-B*x3;
float A,B,C2;
A=y2-y1; B=x1-x2; C2=A*y3-B*x3;
float y11,y22,x4,y4,x5,y5;
if (A!=0)
{y11=(B*x1+C2)/A; y22=(B*x2+C2)/A;}
else
{y11=0; y22=0;}
a=y22-y11;
b=x2-x1;
s1=s1/2;
if(b==0) {al=3.14;} else {al=atan(a/b);};
a1=s1*sin(al);
b1=s1*cos(al);
x4=x3+b1;
y4=y3+a1;
x5=x3-b1;
y5=y3-a1;

//теперь нарисуем
TPoint points[]={
Point(x1,y1),
Point(x3,y3),
Point(x4,y4),
Point(x2,y2),
Point(x5,y5),
Point(x3,y3)};
imag1->Canvas->Pen->Color=clBlack;
imag1->Canvas->Brush->Color=clBlack;
imag1->Canvas->Polygon(points, 5);
imag1->Canvas->Brush->Color=clWhite;
};
Вложения
strelka.JPG
strelka.JPG (5.92 КБ) 326 просмотров
Ответить