Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ соединение точек с помощью DrawPoly

Автор: Sensitive 12.05.2007 4:05

Подскажите пожалуйста.
У меня даны координаты точек. Эти точки нужно последовательно соединить с помощью DrawPoly. координат много (приведу в пример несколько):
(7,0), (7,-1), (6.5,-2.5) и т.д.
Эти координаты нужно как-то переводить в пиксели?Я правильно понимаю?Если да,то как это сделать?

Автор: volvo 12.05.2007 4:18

Цитата
Эти координаты нужно как-то переводить в пиксели?
Естественно... DrawPoly работает с массивом TPoint-ов, представляющих собой координаты точек в пикселях...

Цитата
как это сделать?
Ну, для начала - пробежать по всему массиву, найти мин/макс значение для X и для Y, чтобы масштабировать изображение... Допустим, твой вариант:
Цитата
(7,0), (7,-1), (6.5,-2.5)

Xmin = 6.5; Xmax = 7; то есть, DX(разброс значений X) = 0.5

Ymin = -2.5; Ymax = 0; DY = 2.5

Теперь решаешь, на каком участке экрана ты хочешь видеть свой полигон... Допустим, на полный экран... Тогда
mx = 640 / DX;
my = 480 / DY;
теперь еще раз идем по массиву и КАЖДОЕ значение X меняем на
((X - Xmin)*mx), и каждое значение Y - на ((Y - Ymin)*my)

Все, теперь можно отчерчивать полигон с помощью DrawPoly...

По-моему, ничего не перепутал. unsure.gif


Автор: Sensitive 12.05.2007 4:36

спасибо, я попробую. О результате отчитаюсь:)

Автор: Sensitive 13.05.2007 17:17

у меня не получается...чего-то не понимаю наверное... посмотрите что не так,пожалуйста. Изображение "вверх-ногами" выводится:(

const x:array[1..35] of real=(7,8,7,5,2,-1,-3,-5,-5,-6,-7,-7.5,-10,-9.5,-7,-5,-5,-4,-4,-5,-4,-3,-3,-2,-2,
1,3.5,5,6,5,6,7,6.5,7,7);
y:array[1..35] of real=(-3,-2,2,3,3,3,4,6,7,6,6,5.5,5.5,4.5,4,2,0,-2,-5.5,-6.5,-6.5,-5.5,-3,-2,-1,
-1,-0.5,-2,-5.5,-6.5,-6.5,-5.5,-2.5,-1,0);
var xmin,xmax,ymin,ymax,dx,dy,mx,my:real;
i:byte;
a:array[1..35] of PointType;
begin
setcolor(white);
xmin:=-10; xmax:=8; dx:=18;
ymin:=-6.5; ymax:=7; dy:=13.5;
mx:=640/dx; my:=480/dy;
for i:=1 to 35 do begin
x[i]:=(x[i]-xmin)*mx;
y[i]:=(y[i]-ymin)*my;
end;
for i:=1 to 35 do begin
a[i].x:=trunc(x[i]);
a[i].y:=trunc(y[i]);
end;
drawpoly(35,a);
readln;
CloseGraph;
end.

Автор: volvo 13.05.2007 17:27

Так лучше?

uses graph;
const
x:array[1..35] of real=(
7,8,7,5,2,-1,-3,-5,-5,-6,-7,-7.5,-10,-9.5,-7,-5,-5,-4,-4,-5,-4,-3,-3,
-2,-2,1,3.5,5,6,5,6,7,6.5,7,7);
y:array[1..35] of real=(
-3,-2,2,3,3,3,4,6,7,6,6,5.5,5.5,4.5,4,2,0,-2,-5.5,-6.5,-6.5,-5.5,-3,
-2,-1,-1,-0.5,-2,-5.5,-6.5,-6.5,-5.5,-2.5,-1,0);
var
xmin,xmax,ymin,ymax,dx,dy,mx,my:real;
i:byte;
a:array[1..36] of PointType;

var
gd, gm: integer;

begin
initgraph(gd, gm, '');
setcolor(white);
xmin:=-10; xmax:=8; dx:=18;
ymin:=-6.5; ymax:=7; dy:=13.5;
mx:=640/dx; my:=480/dy;

for i:=1 to 35 do begin
x[i]:=(x[i]-xmin)*mx;
y[i]:=getmaxy - (y[i]-ymin)*my; { <--- "Переворачиваем" изображение }
end;

for i:=1 to 35 do begin
a[i].x:=trunc(x[i]); a[i].y:=trunc(y[i]);
end;

a[36] := a[1]; { <--- Чтобы полигон был замкнутым }
drawpoly(36,a);
readln;
CloseGraph;
end.


Автор: Sensitive 13.05.2007 17:37

Намного лучше,спасибо!
P.S. "замкнуть" полигон вообще забыла...(

Автор: Sensitive 13.05.2007 20:43

Не понимаю... Изображение это я получила...(собака)... осталось "сделать" ей лапы...не получается... помогите пожалуйста и объясните если сможете...
вот что у меня получается...
одна лапа:

Procedure leg1;
const x:array [1..6] of real=(5.5,5.5,4.5,3.5,4.5,5);
y:array [1..6] of real=(-4.5,-5.5,-6.5,-6.5,-5.5,-2);
var xmin,xmax,ymin,ymax,dx,dy,mx,my:real;
begin
xmin:=3.5; xmax:=5.5;dx:=2;
ymin:=-6.5; ymax:=-2;dy:=4.5;
mx:=85/dx; my:=160/dy;
for i:=1 to 6 do begin
x[i]:=(x[i]-xmin)*mx;
y[i]:=getmaxy-(y[i]-ymin)*my;
end;
for i:=1 to 6 do begin
b[i].x:=trunc(x[i]);
b[i].y:=trunc(y[i]);
end;
b[7]:=b[1];
drawpoly(7,b);
end;

и вторая:
Procedure leg2;
const x:array[1..6] of real=(-2,-1.5,-2.5,-3.5,-2.5,-3);
y:array[1..6] of real=(-2,-5.5,-6.5,-6.5,-5.5,-3);
var xmin,xmax,ymin,ymax,dx,dy,mx,my:real;
begin
xmin:=-3.5; xmax:=-1.5;dx:=2;
ymin:=-6.5; ymax:=-2;dy:=4.5;
mx:=150/dx; my:=280/dy;
for i:=1 to 6 do begin
x[i]:=(x[i]-xmin)*mx;
y[i]:=getmaxy-(y[i]-ymin)*my;
end;
for i:=1 to 6 do begin
c[i].x:=trunc(x[i]);
c[i].y:=trunc(y[i]);
end;
c[7]:=c[1];
drawpoly(7,c);
end;

на второй ноге вообще не получается...ноги находятся в начале экрана...а мне надо прикрепить их к изображению собаки с помощью DrawPoly...

Автор: volvo 14.05.2007 15:31

Обязательно надо разбивать отрисовку на подпрограммы? Никак нельзя отрисовать "не отрывая карандаша" от бумаги весь рисунок?

Автор: Sensitive 14.05.2007 15:56

неа, а этом теперь и стоит проблема... именно отдельно идет собачка, отдельно одна нога,и отдельно другая нога...

Автор: Sensitive 15.05.2007 19:40

А может нужно как-то эту процедуру (построения ног) "совместить" с координатной сеткой. я у вас спрашивала про нее уже... вот вы мне ответили...

x:=0;
while x<getmaxx do begin
line(x,0,x,getmaxy);
x:=x+20;
end;
y:=0;
while y<getmaxy do begin
line(0,y,getmaxy,y);
y:=y+20;
end;


P.S. Помогите плиз с этим рисунком... завтра сдавать уже:( не могу придумать как эти ноги "прицепить" собаке с помощью DrawPoly! sad.gif