Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Проблема с поворотом фигуры


Автор: Khan 29.3.2006, 22:31
Требуется двигать фигуру относительно заданной точки на заданный угол. Так вот в чем проблема: от 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);
}

Автор: cardinal 29.3.2006, 23:06
http://forum.vingrad.ru/index.php?showtopic=22163

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)