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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2010, 11:45   #1
Weyner
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 25
Вопрос Рисование !)

Доброго дня всем, такая вот проблема я сделал программу в который надо нарисовать ромб в ромбе круг, а в круге квадрат и заставить двигаться эту фигуру всю верх и вниз, я это все сделал но когда пришел показывать преподавателю он сказал чтобы круг и квадрат чтобы были вписаны как-то геометрическим способом а не методом подгонки, т.е чтобы в ромб был вписан круг а в круг вписан квадрат как показано на рисунке!
вот рисунок:
Вот эта часть программы которая отвечает за рисование:
Код:
procedure TFigure.Show;
var
  c: array [1..4] of TPoint;
begin

c[1].X:=x-size div 2;
c[1].Y:=y;
c[2].X:=x;
c[2].Y:=y-size div 2;
c[3].X:=x+size div 2;
c[3].Y:=y;
c[4].X:=x;
c[4].Y:=y+size div 2;

 canvas.Pen.Color:=ClBlack;
 Canvas.Brush.Color:=ClBlue;
 Canvas.Polygon(c);
 Canvas.Pen.Color:=Clblue;

 //canvas.Pen.Color:=ClBlack;
 //Canvas.Brush.Color:=Clwhite;
  //canvas.ellipse(250,250,150,150);



 canvas.Pen.Color:=Clblack;          
Canvas.Brush.Color:=Clwhite;
  {круг} 
Canvas.ellipse(x+size*4 div 11,y+size*4 div 11,x-size*4 div 11,y-size*4 div 11);



  canvas.Pen.Color:=ClBlack;
 Canvas.Brush.Color:=Clred;
{ квадрат}
canvas.Rectangle(x-size*3 div 12,y-size*3 div 12,x+size*3 div 12,y+size*3 div 12);

end;
Выделенные строчки кода жирным он говорит что эт подгонка и надо геометрически!!!!! я уже весь мозг ......))

Перенесено к студентам.
Модератор

Последний раз редактировалось mihali4; 23.10.2010 в 12:01.
Weyner вне форума Ответить с цитированием
Старый 23.10.2010, 12:09   #2
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

http://ru.wikipedia.org/wiki/Квадрат А уже для того, чтобы построить эллипс (окружность), напишите функцию или воспользуйтесь моей (но она просто рисует окружность без возможности закрасить её привычным вам методом) В моей функции: ACanvas - холст на котором собираетесь рисовать (пример: Form1.Canvas), X0, Y0 - начальные координаты, R - радиус, CordsX, CordsY - возвращаемые параметры (это же моя функция, мне это надо было, можете подредактировать её под себя)
Вложения
Тип файла: zip Circle.zip (425 байт, 13 просмотров)
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 23.10.2010 в 12:14.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 23.10.2010, 12:18   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

У всех фигур центр находится в одной точке, поэтому и рисовать нужно относительно неё. А у вас я так понимаю координаты задаются левым верхним углом фигуры. Я бы эти x и y заменил на:
Код:
var
  center: TPoint; // Центр фигуры. Его и нужно будет менять для перемещения фигуры
За основу я бы взял квадрат. Для него нам нужна только длина стороны.
Задаём её константой:
Код:
const
  a = 10;
Чтобы нарисовать круг, нужно знать его радиус. Как видно из рисунка, диаметр круга равен длине диагонали квадрата. Ну а диагональ квадрата по теории пифагора (квадрат гипотенузы равен сумме квадратов катетов) равен корень двух умножить на a. Назовем диаметр d. Проблема в том, что для рисования круга нужно задать квадрат, в который он будет вписан. В данном случае нужно будет задать координаты квадраты с длиной стороны равной d.
Ромб по сути так же является квадратом со сторонами d. Чтобы его нарисовать, нужно узнать длину диагоналей. А это делается по полюбившейся теореме пифагора.
Код:
var
  b: integer; // Длина диагонали ромба
  d: integer; // Длина диагонали квадрата и диаметр круга
const
  a = 10; // Длина стороны квадрата
begin
  d := Round(sqrt(2)*a);
  b := Round(sqrt(2)*d);

  {Ромб}
  c[1].x := center.x;
  c[1].y := center.y - (b div 2);
  c[2].x := center.x + (b div 2);
  c[2].y := center.y;
  c[3].x := center.x;
  c[3].y := center.y + (b div 2);
  c[4].x := center.x - (b div 2);
  c[4].y := center.y;

  Canvas.Pen.Color:=ClBlack;
  Canvas.Brush.Color:=ClBlue;
  Canvas.Polygon(c);
  Canvas.Pen.Color:=Clblue;

  {Круг}
  Canvas.Pen.Color:=Clblack;          
  Canvas.Brush.Color:=Clwhite;
  Canvas.ellipse(center.x - (d div 2), center.y - (d div 2),
                      center.x + (d div 2), center.y + (d div 2));

  {Квадрат}
  Canvas.Pen.Color:=ClBlack;
  Canvas.Brush.Color:=Clred;
  Canvas.Rectangle(center.x - (a div 2), center.y - (a div 2),
                           center.x + (a div 2), center.y + (a div 2));
end;
Вот как-то так. Все эти (a div 2) лучше конечно вынести в локальные переменные, а то слишком много делений лишних получается.
Надеюсь с формулами ничего не намудрил, а то здесь писал и не проверял код
pu4koff вне форума Ответить с цитированием
Старый 23.10.2010, 12:40   #4
Weyner
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 25
По умолчанию

спс огромное очень помогло разобрался, но были некоторые не дочеты но там я уже доработал спс те !огромное !)))
Weyner вне форума Ответить с цитированием
Старый 23.10.2010, 14:53   #5
Weyner
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 25
Вопрос

Но у мя терь такая маленьькая проблема круг сьезжает в лево при уменьшении фигуры
Weyner вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование !) Weyner Помощь студентам 0 23.10.2010 09:20
Рисование Masip Общие вопросы Delphi 10 08.06.2010 22:16
Рисование Granus Общие вопросы Delphi 2 24.12.2008 07:44
Рисование TriCERATOP Помощь студентам 5 28.11.2008 15:09