Требуется двигать фигуру относительно заданной точки на заданный угол. Так вот в чем проблема: от 0 до 180 градусов движется нормально, а затем начинаются портаки. Дело в том, что в расчетах я ипользую косинус, а в нем же значения углов от 0 до 180, а затем от 180 до 360 градусов повторяются, т.е. значение 0 равно 90 и 270 градусов, - sqrt(3)/2 равно 150 и 210 градусов. Что мне можно сделать, может нужно использовать что-то другое? Ниже часть примерного кода программы:
| Код | //---------------------------------------------------------------------------
#include <vcl.h> #pragma hdrstop
#include "Unit1.h" #include "math.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int x,y; //центр круга float dx,r; //радиус круга и 1/2 гориз. линии float rad=M_PI/180; //коэф. перевода градусов в радианы; int f,f1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void TForm1::Draw(int x,int y,int r,int f) //функция построения фигуры { float x0,y0,x1,y1; f1=90-f; dx=sqrt(r*r-((r*r)/4)); x0=x+r*cos(f*rad); y0=y-r*sin(f*rad); x1=x0-(3*r/2)*cos(f*rad); y1=y0+(3*r/2)*sin(f*rad);
Canvas->Pen->Color=clBlack; Canvas->Brush->Color=clWhite;
Canvas->Ellipse(x-r,y-r,x+r,y+r);
Canvas->MoveTo(x0,y0); Canvas->LineTo(x1,y1);
Canvas->LineTo(x1-dx*cos(f1*rad),y1-dx*sin(f1*rad));
Canvas->MoveTo(x1,y1); Canvas->LineTo(x1+dx*cos(f1*rad),y1+dx*sin(f1*rad)); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) //поворот фигуры на заданный угол { //относительно заданной точки float xx,yy,r0,zz; int z; z=StrToInt(Edit1->Text); //заданный угол в градусах xx=StrToFloat(Edit2->Text); // кординаты заданной yy=StrToFloat(Edit3->Text); // точки
r0=sqrt((xx-x)*(xx-x)+(yy-y)*(yy-y)); //рассотяние между текущей и заданной точками
zz=acos((x-xx)/r0); //угол расположения фигуры от заданной точки
x=xx+r0*cos(z*rad+zz); //новое положение y=yy-r0*sin(z*rad+zz); //фигуры
f=f+z; Clear(); Draw(x,y,r,f);
} //---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) //положение фигуры { //по умолчанию x=400; y=350; r=50;f=60; Draw(x,y,r,f); } //---------------------------------------------------------------------------
void TForm1::Clear() //функция очистки поля { Canvas->Pen->Color=Form1->Color; Canvas->Brush->Color=Form1->Color; Canvas->Rectangle(50,50,750,650); }
|
|