Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 856

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Подскажите пожалуйста как можно нарисовать пирамиду, так чтобы при ее вращении по трем осям удалялись невидимые линии. через полигоны???

Синельникова Ирина Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Синельникова Ирина (статус: Посетитель)
Вопрос отправлен: 24 декабря 2010, 21:13
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 27 декабря 2010, 00:18; участников в обсуждении: 3.
Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 24 декабря 2010, 22:13 [#1]:

А вы её хотя бы с видимыми линиями построили?
Синельникова Ирина

Синельникова Ирина (статус: Посетитель), 25 декабря 2010, 14:32 [#2]:

с видимыми линиями получилось, а вот с удалением что то никак
Синельникова Ирина

Синельникова Ирина (статус: Посетитель), 25 декабря 2010, 15:03 [#3]:

vektor=array[1..4]of real;
matrix=array[1..4,1..4]of real;
const
cosf=0.96592;
sinf=0.25882;
e1:vektor=(1,0,0,1);
e2:vektor=(0,1,0,1);
e3:vektor=(0,0,1,1);
e4:vektor=(0,0,0,1);
m_D_Plus:matrix=((1.1,0,0,0),
(0,1.1,0,0),
(0,0,1.1,0),
(0,0,0,1));
m_D_Minus:matrix=((0.9,0,0,0),
(0,0.9,0,0),
(0,0,0.9,0),
(0,0,0,1));
m_Rx:matrix=((1,0,0,0),
(0,cosf,-sinf,0),
(0,sinf,cosf,0),
(0,0,0,1));
m_Ry:matrix=((cosf,0,sinf,0),
(0,1,0,0),
(-sinf,0,cosf,0),
(0,0,0,1));
m_Rz:matrix=((cosf,-sinf,0,0),
(sinf,cosf,0,0),
(0,0,1,0),
(0,0,0,1));
m_Pro:matrix=((1,0,1.4142/4,0),
(0,1,1.4142/4,0),
(0,0,0,0),
(0,0,0,1));
m_My:matrix=((1,0,0,0),
(0,-1,0,0),
(0,0,1,0),
(0,0,0,1));
m_D_P:matrix=((1.5,0,0,0),
(0,1.5,0,0),
(0,0,1.5,0),
(0,0,0,1));

var
Form1: TForm1;
M:matrix;
x0,x1,y0,y1:real;

function MultMatrix(M1,M2:matrix):matrix;
function Mult(A:matrix;B:vektor):vektor;
function ii(x:real):integer;
function jj(y:real):integer;
procedure Drawing(G:matrix);

implementation

{$R *.dfm}

function MultMatrix(M1,M2:matrix):matrix;
var i,j,k:integer;
M:matrix;
begin
for i:=1 to 4 do
for k:=1 to 4 do
for j:=1 to 4 do
M[i,j]:=M[i,j]+M1[i,k]*M2[k,j];
Result:=M
end;

function Mult(A:matrix;B:vektor):vektor;
var i,j:integer;
C:vektor;
begin
for i:=1 to 4 do
begin
C[i]:=0;
for j:=1 to 4 do
C[i]:=A[i,j]*B[j]+C[i];
end;
Result:=C
end;

function ii(x:real):integer;
begin
ii:=trunc(Form1.Image1.Width*(x-x0)/(x1-x0));
end;

function jj(y:real):integer;
begin
jj:=trunc(Form1.Image1.Height*(y1-y)/(y1-y0));
end;

procedure Drawing(G:matrix);
var a,b,c,d,w:vektor;
t:real;
Ic,Jc,i,j,p,q,s,r:integer;
begin
Form1.Image1.Canvas.Rectangle(0,0,Form1.Image1.Width,Form1.Image1.Height);
Ic:=Form1.Image1.Width div 2;
Jc:=Form1.Image1.Height div 2;

Form1.Image1.Canvas.MoveTo(Ic,Jc);
Form1.Image1.Canvas.Pen.Color:=clblue;
a:=Mult(G,e1);
i:=ii(a[1]);
j:=jj(a[2]);
Form1.Image1.Canvas.LineTo(i,j);
Form1.Image1.Canvas.TextOut(i,j,'x');

Form1.Image1.Canvas.MoveTo(Ic,Jc);
Form1.Image1.Canvas.Pen.Color:=clblue;
a:=Mult(G,e2);
i:=ii(a[1]);
j:=jj(a[2]);
Form1.Image1.Canvas.LineTo(i,j);
Form1.Image1.Canvas.TextOut(i,j,'y');

Form1.Image1.Canvas.MoveTo(Ic,Jc);
Form1.Image1.Canvas.Pen.Color:=clblue;
a:=Mult(G,e3);
i:=ii(a[1]);
j:=jj(a[2]);
Form1.Image1.Canvas.LineTo(i,j);
Form1.Image1.Canvas.TextOut(i,j,'z');

Form1.Image1.Canvas.MoveTo(Ic,Jc);
Form1.Image1.Canvas.TextOut(Ic,Jc,'0');

t:=0;
d[1]:=t;
d[2]:=(5+t)/3;
d[3]:=(17-5*t)/6;
d[4]:=1;
d:=Mult(G,d);
s:=ii(d[1]);
r:=jj(d[2]);
Form1.Image1.Canvas.MoveTo(s,r);
repeat
t:=t+1;
d[1]:=t;
d[2]:=(5+t)/3;
d[3]:=(17-5*t)/6;
d[4]:=1;
d:=Mult(G,d);
i:=ii(d[1]);
j:=jj(d[2]);
Form1.Image1.Canvas.Pen.Color:=clred;
Form1.Image1.Canvas.LineTo(i,j);
until t<>2;

t:=0;
b[1]:=t;
b[2]:=(t+5)/2;
b[3]:=(-3*t-1)/2;
b[4]:=1;
b:=Mult(G,b);
Form1.Image1.Canvas.MoveTo(i,j);
repeat
t:=t+1;
b[1]:=t;
b[2]:=(t+5)/2;
b[3]:=(-3*t-1)/2;
b[4]:=1;
b:=Mult(G,b);
p:=ii(b[1]);
q:=jj(b[2]);
Form1.Image1.Canvas.Pen.Color:=clred;
Form1.Image1.Canvas.LineTo(p,q);
until t<>2;

t:=0;
c[1]:=t;
c[2]:=(5+3*t)/4;
c[3]:=(9-5*t)/2;
c[4]:=1;
c:=Mult(G,c);
Form1.Image1.Canvas.MoveTo(p,q);
repeat
t:=t+1;
c[1]:=-t;
c[2]:=(5+3*t)/4;
c[3]:=(9-5*t)/2;
c[4]:=1;
c:=Mult(G,c);
k:=ii(c[1]);
n:=jj(c[2]);
Form1.Image1.Canvas.Pen.Color:=clred;
Form1.Image1.Canvas.LineTo(s,r);
until t<>2;

w[1]:=0;
w[2]:=0;
w[3]:=0;
w[4]:=1;
w:=Mult(G,w);
Form1.Image1.Canvas.MoveTo(Ic,Jc);
Form1.Image1.Canvas.Pen.Color:=clyellow;
Form1.Image1.Canvas.LineTo(s,r);
Form1.Image1.Canvas.MoveTo(Ic,Jc);
Form1.Image1.Canvas.Pen.Color:=clgray;
Form1.Image1.Canvas.LineTo(i,j);
Form1.Image1.Canvas.MoveTo(Ic,Jc);
Form1.Image1.Canvas.Pen.Color:=clgreen;
Form1.Image1.Canvas.LineTo(p,q);
end;

procedure TForm1.DrawClick(Sender: TObject);
begin
M:=m_Pro;
Drawing(M);
end;

procedure TForm1.PlusClick(Sender: TObject);
begin
M:=MultMatrix(M,m_D_Plus);
Drawing(M);
end;

procedure TForm1.MinusClick(Sender: TObject);
begin
M:=MultMatrix(M,m_D_Minus);
Drawing(M);
end;

procedure TForm1.XvrClick(Sender: TObject);
begin
M:=MultMatrix(M,m_Rx);
Drawing(M);
end;

procedure TForm1.YvrClick(Sender: TObject);
begin
M:=MultMatrix(M,m_Ry);
Drawing(M);
end;

procedure TForm1.ZvrClick(Sender: TObject);
begin
M:=MultMatrix(M,m_Rz);
Drawing(M);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
x0:=-3;
x1:=3;
y0:=-3;
y1:=3;
end;

end.
IlluminatI

IlluminatI (статус: 2-ой класс), 27 декабря 2010, 00:18 [#4]:

о_О epic fail.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:03
Выполнено за 0.03 сек.