C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
стрелка под любым углом
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 — длина лепестков, пикс. wink.gif

User Attached Image Скачать файл
Rotate_Arrow.zip


R@kot
  Отправлено: 10.01.2005, 07:26


Дежурный стрелочник

Группа: Участник
Сообщений: 32



У меня тоже как-то возникла такая проблема, но нужно было нарисовать стрелку, которая начинается и кончается в каких-то определённых заданных точках. Практически не помня курса геометрии wink.gif , я накропал примерно следующее (может кому ещё пригодится):

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 — длина лепестков стрелки (пикселы)

Удачи всем при решении заковыристых геометрических задачек !!!
wink.gif

Отредактировано R@kot — 10/01/2005, 08:39
salmi
Отправлено: 11.01.2005, 01:10


Ученик-кочегар

Группа: Участник
Сообщений: 4



Пасиба ребят! То что надо smile.gif

Вернуться в Вопросы программирования в C++Builder