salmi |
Отправлено: 10.01.2005, 00:18 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 4
|
Люди помогите нарисовать на канве стрелку под любым углом. Очень очень надо. (----->)
Заранее спасибо. |
|
ROLpogo |
Отправлено: 10.01.2005, 04:32 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 12
|
CODE |
#include <math.h>
void __fastcall TForm1::DrawArrow(TCanvas* ptCanvas,int BigCorner,int SmallCorner,int CanWidth,int CanHeight,int ArrowLength,int SmallALength)
{
TPoint CenterPoint;
TPoint FirstPoint;
TPoint SecondPoint;
CenterPoint.x=CanWidth/2;
CenterPoint.y=CanHeight/2;
double CosCorner=cos(M_PI/180.*BigCorner);
double SinCorner=sin(M_PI/180.*BigCorner);
FirstPoint.x=CenterPoint.x+ArrowLength*CosCorner/2.+.5;
FirstPoint.y=CenterPoint.y-ArrowLength*SinCorner/2.+.5;
SecondPoint.x=CenterPoint.x-ArrowLength*CosCorner/2.+.5;
SecondPoint.y=CenterPoint.y+ArrowLength*SinCorner/2.+.5;
ptCanvas->MoveTo(SecondPoint.x,SecondPoint.y);
ptCanvas->LineTo(FirstPoint.x,FirstPoint.y);
TPoint SmallFirstPoint;
TPoint SmallSecondPoint;
double SmallCosCorner1=cos(M_PI/180.*(90-BigCorner+SmallCorner));
double SmallSinCorner1=sin(M_PI/180.*(90-BigCorner+SmallCorner));
double SmallCosCorner2=cos(M_PI/180.*(90-BigCorner-SmallCorner));
double SmallSinCorner2=sin(M_PI/180.*(90-BigCorner-SmallCorner));
SmallFirstPoint.x=FirstPoint.x-SmallALength*SmallSinCorner1+.5;
SmallFirstPoint.y=FirstPoint.y+SmallALength*SmallCosCorner1+.5;
SmallSecondPoint.x=FirstPoint.x-SmallALength*SmallSinCorner2+.5;
SmallSecondPoint.y=FirstPoint.y+SmallALength*SmallCosCorner2+.5;
ptCanvas->MoveTo(FirstPoint.x,FirstPoint.y);
ptCanvas->LineTo(SmallFirstPoint.x,SmallFirstPoint.y);
ptCanvas->MoveTo(FirstPoint.x,FirstPoint.y);
ptCanvas->LineTo(SmallSecondPoint.x,SmallSecondPoint.y);
}
|
Здесь:
ptCanvas — указатель на канву.
BigCorner — угол отклонения стрелки, град.
SmallCorner — угол отклонения лепестков стрелки, груд.
CanWidth — ширина канвы, пикс.
CanHeight — высота канвы, пикс.
ArrowLength — длина стрелки, пикс.
SmallALength — длина лепестков, пикс.
|
|
R@kot |
Отправлено: 10.01.2005, 07:26 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 32
|
У меня тоже как-то возникла такая проблема, но нужно было нарисовать стрелку, которая начинается и кончается в каких-то определённых заданных точках. Практически не помня курса геометрии , я накропал примерно следующее (может кому ещё пригодится):
CODE |
#include <math.h>
//Функция для рисования линии со стрелкой
void DrawLine(TCanvas* Canvas, double x0, double y0, double x1, double y1, double ArrowAngle, int ArrowLen){
ArrowAngle = ArrowAngle*M_PI/180;
//Длина основной линии
int Len = sqrt((x0-x1)*(x0-x1) + (y0-y1)*(y0-y1));
//Угол наклона основной линии
double Angle;
if(x0==x1 && y0<y1){
Angle = M_PI/2;
}
else if(x0==x1 && y0>y1){
Angle = 3*M_PI/2;
}
else if(x0>x1 && y0==y1){
Angle = 0;
}
else if(x0<x1 && y0==y1){
Angle = M_PI;
}
else if(x0>x1 && y0<y1){
Angle = asin((y1-y0)/Len);
}
else if(x0<x1 && y0<y1){
Angle = M_PI — asin( (y1-y0)/Len);
}
else if(x0<x1 && y0>y1){
Angle = M_PI-asin((y1-y0)/Len);
}
else if(x0>x1 && y0>y1){
Angle = 2*M_PI+asin( (y1-y0)/Len);
}
int x2 = x1 + ArrowLen * cos(Angle+ArrowAngle); // конец первого лепестка по X
int y2 = y1 — ArrowLen * sin(Angle+ArrowAngle); // конец первого лепестка по Y
int x3 = x1 + ArrowLen * cos(Angle-ArrowAngle); // конец второго лепестка по X
int y3 = y1 — ArrowLen * sin(Angle-ArrowAngle); // конец конец второго лепестка по Y
// рисуем саму линию
Canvas->MoveTo(x0,y0);
Canvas->LineTo(x1,y1);
//Рисуем лепестки
TPoint points[3];
points[0] = Point(x1,y1);
points[1] = Point(x2,y2);
points[2] = Point(x3,y3);
Canvas->Polygon(points, 2);
}
|
Здесь x0 и y0 — координаты начала стрелки
x1 и y1 — координаты конца стрелки
ArrowAngle — угол, на который лепестки стрелки расходятся от основной линии (градусы)
ArrowLen — длина лепестков стрелки (пикселы)
Удачи всем при решении заковыристых геометрических задачек !!!
Отредактировано R@kot — 10/01/2005, 08:39
|
|
salmi |
Отправлено: 11.01.2005, 01:10 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 4
|
Пасиба ребят! То что надо |
|
|