Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2010, 20:57   #1
magic1
Новичок
Джуниор
 
Регистрация: 10.08.2010
Сообщений: 3
По умолчанию N-угольник на С++ Borland

Нужно написать программу которая бы по заданным координатам рисовала n-угольник при нажатии одной кнопки, а при нажатии на другую кнопку внутри первого n-угольника на заданном растоянии рисовался идентичный ему n-угольник и чтобы все стороны внутреннего n-угольника были параллельны сторонам первого n-угольника. Пример для квадрата:

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TPoint p[4] ; // четыре вершины
// координаты вершин
p[0].x = StrToInt(Edit1->Text);  p[0].y = StrToInt(Edit2->Text) ;
p[1].x = StrToInt(Edit3->Text);  p[1].y = StrToInt(Edit4->Text);
p[2].x = StrToInt(Edit5->Text);  p[2].y = StrToInt(Edit6->Text);
p[3].x = StrToInt(Edit7->Text);  p[3].y = StrToInt(Edit8->Text);
Canvas->Pen->Width = 2;
Canvas->Pen->Color = clRed;
Canvas->Polygon(p,3);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  char K;
K = StrToInt(Form1->Edit9->Text);
 TPoint p[4];
  // координаты вершин
p[0].x = StrToInt(Edit1->Text) + K;  p[0].y = StrToInt(Edit2->Text) + K;
p[1].x = StrToInt(Edit3->Text) + K;  p[1].y = StrToInt(Edit4->Text) - K;
p[2].x = StrToInt(Edit5->Text) - K;  p[2].y = StrToInt(Edit6->Text) - K;
p[3].x = StrToInt(Edit7->Text) - K;  p[3].y = StrToInt(Edit8->Text) + K;
Canvas->Pen->Width = 2;
Canvas->Pen->Color = clBlack;
Canvas->Polygon(p,3);
}
Помогите пожалуйста с обобщенной формулой для всех типов многоугольников

Последний раз редактировалось Stilet; 11.08.2010 в 08:52.
magic1 вне форума Ответить с цитированием
Старый 10.08.2010, 22:07   #2
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

А в чем проблема? Вот ты рисуешь полигон:
Код:
Canvas->Polygon(p,3);
Делаешь так:
Код:
TPoint p[5] ; // пять вершины
// координаты вершин
p[0].x = StrToInt(Edit1->Text); p[0].y = StrToInt(Edit2->Text) ;
p[1].x = StrToInt(Edit3->Text); p[1].y = StrToInt(Edit4->Text);
p[2].x = StrToInt(Edit5->Text); p[2].y = StrToInt(Edit6->Text);
p[3].x = StrToInt(Edit7->Text); p[3].y = StrToInt(Edit8->Text);
p[4].x = StrToInt(Edit9->Text); p[4].y = StrToInt(Edit10->Text);
Canvas->Pen->Width = 2;
Canvas->Pen->Color = clRed;
Canvas->Polygon(p,4);
И вуаля: у тебя нарисован 5-и угольник...
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 10.08.2010, 22:25   #3
magic1
Новичок
Джуниор
 
Регистрация: 10.08.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Impuls1989 Посмотреть сообщение
А в чем проблема? Вот ты рисуешь полигон:
Код:
Canvas->Polygon(p,3);
Делаешь так:
Код:
TPoint p[5] ; // пять вершины
// координаты вершин
p[0].x = StrToInt(Edit1->Text); p[0].y = StrToInt(Edit2->Text) ;
p[1].x = StrToInt(Edit3->Text); p[1].y = StrToInt(Edit4->Text);
p[2].x = StrToInt(Edit5->Text); p[2].y = StrToInt(Edit6->Text);
p[3].x = StrToInt(Edit7->Text); p[3].y = StrToInt(Edit8->Text);
p[4].x = StrToInt(Edit9->Text); p[4].y = StrToInt(Edit10->Text);
Canvas->Pen->Width = 2;
Canvas->Pen->Color = clRed;
Canvas->Polygon(p,4);
И вуаля: у тебя нарисован 5-и угольник...

Задача состоит не в том чтобы нарисовать пятиугольник а в том чтобы внутри одного многоугольника был нарисован второй причем на указанном растоянии и чтобы все стороны второго были параллельны сторонам первого как в примере
magic1 вне форума Ответить с цитированием
Старый 10.08.2010, 22:48   #4
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Не знаю на сколько это будет уместно, но можно попробовать так:
1. Разрезаем многоугольник на четыре равные части (вдоль и поперек)
Далее идем по четвертям:
1 Четверть:
Все точки смещаем в низ и влево на K
2 Четверть:
Все точки смещаем в низ и вправо на K
3 Четверть:
Все точки смещаем в верх и вправо на K
4 Четверть:
Все точки смещаем в верх и влево на K
Точки, лежащие на линиях, разрезающих многоугольник:
Верх:
Смещаем в низ
Низ:
Смещаем в верх
Лево:
Смещаем в право
Право:
Смещаем в лево
Сию идею на практике я не проверял, но на листике у меня вроде бы получалось уменьшить любой многоугольник.
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 10.08.2010, 23:43   #5
magic1
Новичок
Джуниор
 
Регистрация: 10.08.2010
Сообщений: 3
По умолчанию

Попробуй пятиугольник с такими координатами:

1(60;80)
2(220;60)
3(260;160)
4(160;140)
5(40;200)

Я брал за одну клеточку 20ед.
magic1 вне форума Ответить с цитированием
Старый 11.08.2010, 10:17   #6
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

набери в википедии: правильный многоугольник.
Там есть формулы для расчета координат вершин многоугольников в зависимости от числа вершин, радиуса описанной окружности и центра.

И все : только меняй радиусы окружности, получишь хоть тысячу соосных многоугольников.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 11.08.2010, 16:47   #7
Stepler
Форумчанин
 
Аватар для Stepler
 
Регистрация: 03.02.2008
Сообщений: 213
По умолчанию

Все довольно таки просто!
1. 360 / n, где n количество углов многоугольника, так мы узнаем шаг смещения(шаг угла) передвижения точки по окружности. Вычислить координаты точки после смещения на угол (а) можно по формуле:
x = r*cos(a) + u
y = r*sin(a) + v
Где r радиус окружности, а - угол заданый в радианах, (u, v) - координаты центра окружности.

2. Чтобы вписать нужно просто уменшить радиус окружности, и повторить действия описание в 1 шаге.

И потом вконце соединить все точки отрезками.
Пишу программы на заказ, контакты под аватаром!
Отзывы тут
Stepler вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Borland C++ DenVall Помощь студентам 5 04.07.2010 13:27
не могу запустить ехешник ,Borland 5 и Borland 6 error_13 Общие вопросы C/C++ 0 31.01.2010 14:04
Выпуклый N-угольник 6AZblJlb Паскаль, Turbo Pascal, PascalABC.NET 3 08.12.2008 21:35
Выпуклый N-угольник и его диагонали 6AZblJlb Помощь студентам 4 08.12.2008 00:15
Вписанная в выпуклый n-угольник окружность Nixond Паскаль, Turbo Pascal, PascalABC.NET 10 15.10.2008 13:28