Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Как нарисовать прямоугольник под углом?


Автор: Faraon 31.10.2006, 11:10
Здравствуйте.
Мне нужна помощь. Нужно написать процедуру для рисования прямоугольника под некоторым углом.

procedure ortogonal (x1,y1,x2,y2:integer);
где x1,y1 - координаты нажатия кнопки мыши.
       х2,х2 - текущие координаты указателя мыши при нажатой кнопке.

Прямоугольник должен рисоваться через polygon.
Помогите пожалуйста. 

Автор: Digar 31.10.2006, 13:02
Не понятно: x1,y1-x2,y2 определяют только одну сторону прямоугольника???

Автор: Alexeis 31.10.2006, 14:48
Цитата(Digar @  31.10.2006,  13:02 Найти цитируемый пост)
Не понятно: x1,y1-x2,y2 определяют только одну сторону прямоугольника??? 

Не хватает данных. По этим данным можно построить бесконечное число прямоугольников (под разными углами) Вспомним хотя бы треугольник вписанный в окружность опирающийся на диаметр. У него всегда угол бдет 90 градусов, а если к его гипотенузе приложить такой же  треугольник повернутый на 180 градусов, то все 4 угла будут по 90 градусов, а таких треугольников можно сделать любое количество

Автор: Faraon 31.10.2006, 20:15
Нет нет. x1y1 - это середина одной стороны прямоугольника, x2y2 - другой, ей противоположной.
Это именно середины противоположных сторон (входные параметры). Я затрудняюсь найти координаты всех углов прямоугольника, который расположен под углом

Автор: Snowy 31.10.2006, 20:29
Цитата(Faraon @  31.10.2006,  21:15 Найти цитируемый пост)
Нет нет. x1y1 - это середина одной стороны прямоугольника, x2y2 - другой, ей противоположной.
Противоположной или перпендикулярной?
Противоположная сторона также ничего не даёт smile

Автор: Alexeis 31.10.2006, 21:14
Цитата(Snowy @  31.10.2006,  20:29 Найти цитируемый пост)
Противоположной или перпендикулярной?

Ни тот ни другой вариант не дает однозначности. Я вот только что нарисовал две точки и по ним построил 8 различных прямоугольников соответствующих этому условию (можно сколько угодно). 

Автор: Faraon 1.11.2006, 15:14
Ребята, в принципе у меня не работает только одна формула. Подскажите правильную.
Вот моя процедура:

Код

procedure draw_wind(x1,y1,x2,y2,size:integer);
// x1,y1,x2,y2 - координаты начала и конца линии (в нашем случае прямоугольника)
//size - толщина линии
 
var tol :byte;  //половина толщины линии
      sh : integer;  //смещение
begin
  with form_main.im.Canvas do
  begin
    pen.Width:=size;
    pen.Color:=clBlack;
    pen.Width:=1;
    tol:=ceil(size/2); 

   //эта формула не работает. Подскажите как надо написать.
    sh:=ceil(tol*sin(arctan((y1-y2)/(x1-x2))));

    if y1 = y2 then  //рисуем горизонтальную линию
      polygon([  point(x1,y1-tol),point(x2,y2-tol),
                 point(x2,y2+tol),point(x1,y1+tol) ]);
    if x1 = x2 then  //рисуем вертикальную линию
      polygon([  point(x1-tol,y1),point(x2-tol,y2),
                 point(x2+tol,y2),point(x1+tol,y1) ]);
    
    //рисуем линию под углом
    if (x1<x2) and (y1<y2) then
      polygon([  point(x1+sh,y1-sh),point(x2+sh,y2-sh),
                       point(x2-sh,y2+sh),point(x1-sh,y1+sh) ]);

    if (x1<x2) and (y1>y2) then
      polygon([  point(x1-sh,y1-sh),point(x2-sh,y2-sh),
                       point(x2+sh,y2+sh),point(x1+sh,y1+sh) ]);

    if (x1>x2) and (y1>y2) then
      polygon([  point(x1-sh,y1+sh),point(x2-sh,y2+sh),
                       point(x2+sh,y2-sh),point(x1+sh,y1-sh) ]);

    if (x1>x2) and (y1<y2) then
      polygon([  point(x1+sh,y1+sh),point(x2+sh,y2+sh),
                       point(x2-sh,y2-sh),point(x1-sh,y1-sh) ]);
  end;
end;


Автор: Alexeis 1.11.2006, 15:56
Модератор: Для выделения кода есть кнопка "КОД". Попробуйте ее в действии  smile 
Цитата(Faraon @  1.11.2006,  15:14 Найти цитируемый пост)
Подскажите правильную.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)