ПАША |
Отправлено: 12.07.2003, 18:08 |
|
Не зарегистрирован
|
Что-то меня глючит.
Какую формулу нужно заюзать, чтобы нарисовать точками круг?
Метод ellipse канвы не предлагать |
|
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 |
|
Не зарегистрирован
|
Работает
Только вот круг не замкнутый получается |
|
Георгий |
Отправлено: 13.07.2003, 01:04 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
а ты точки отрезками соедини — почти круглый получится
или шаг поменьше сделай — например 0.001 |
|
Guest |
Отправлено: 13.07.2003, 02:03 |
|
Не зарегистрирован
|
Да мне сам круг не нужен, а нужны координаты, т.е воединение линиями не катит... Еще плохо, что не последвательно эти координаты вычисляются |
|
Георгий |
Отправлено: 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;
}
}
|
|