Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с поворотом фигуры 
:(
    Опции темы
Khan
Дата 29.3.2006, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 22.2.2006

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
cardinal
Дата 29.3.2006, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99





--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.