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

 
Формула.. круга?...
ПАША
Отправлено: 12.07.2003, 18:08


Не зарегистрирован







Что-то меня глючит.
Какую формулу нужно заюзать, чтобы нарисовать точками круг?

Метод ellipse канвы не предлагать smile.gif
Admin
Отправлено: 12.07.2003, 20:30


Владимир

Группа: Администратор
Сообщений: 1190



CODE


#include <math.h>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   int r = 50; // радиус круга
   for(int i=0; i<360; i++){
    int x = r * sin(180*i/3.1415);
    int y = r * cos(180*i/3.1415);
    Form1->Canvas->Pixels[x+100][y+100] = clRed;
    }
}
//---------------------------------------------------------------------------


Алексей
Отправлено: 12.07.2003, 23:18


Не зарегистрирован







Спасибо, попробую!
Алексей
Отправлено: 12.07.2003, 23:53


Не зарегистрирован







Работает smile.gif
Только вот круг не замкнутый получается sad.gif
Георгий
Отправлено: 13.07.2003, 01:04


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



а ты точки отрезками соедини — почти круглый получится
или шаг поменьше сделай — например 0.001
Guest
Отправлено: 13.07.2003, 02:03


Не зарегистрирован







Да мне сам круг не нужен, а нужны координаты, т.е воединение линиями не катит... Еще плохо, что не последвательно эти координаты вычисляются sad.gif
Георгий
Отправлено: 13.07.2003, 11:27


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



если нужны только координаты, то что мешает решить такое уравнение:
X^2+Y^2=R^2; => X^2=R^2-Y^2; => |X|=(R^2-Y^2)^(0.5)
=> X=(R^2-Y^2)^(0.5) и X=-(R^2-Y^2)^(0.5)
где X,Y — координаты точек на окружности
R — радиус окружности
sprinter
Отправлено: 13.07.2003, 16:48


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

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



И что значит "непоследовательно", если в первом примере угол изменяется от 0 до 360?
sprinter
Отправлено: 13.07.2003, 19:43


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

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



Ага, в пример закралась опечатка. Sin и Cos — периодические, поэтому точки вычислялись не подряд.
С добавлениями это будет выглядеть так

#include
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int r = 50; // радиус круга
int k; // масштаб
k=r/10+1;
for(int i=0; i<360*k; i++){
int x = r * sin(M_PI*i/(180*k));
int y = r * cos(M_PI*i/(180*k));
Form1->Canvas->Pixels[x+100][y+100] = clRed;
}
}

Масштаб вводится для уменьшения дискретности при увеличении радиуса. В данном случае — если радиус r < 10, то точки вычисляются через 1 градус, 10 <= r < 20 — через 0,5 градуса и т.д. Удобственно при изменяющемся радиусе.
Guest
Отправлено: 14.07.2003, 01:18


Не зарегистрирован







Thanks, попробую!
AndreyAGSoft
Отправлено: 18.07.2003, 10:00


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

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



Или , если в ортоганальных координатах так(разница только в ма аппарате):

#include

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int r = 50; // радиус круга
for(int i=0; i int y =pow((pow(r,2)-pow(i,2)),0.5);
Form1->Canvas->Pixels[i][y] = clRed;
}
}

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