Пятница, 03.05.2024, 21:25

Delphi

Приветствую Вас Гость

Друзья сайта
Статистика

Сегодня были:
Самые активные пользователи

Меню сайта
Наш опрос
Чему уделять больше внимания?
Всего ответов: 64
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » MIDletPascal » Для новичков » простой и красивый 3d-тетраэдр
простой и красивый 3d-тетраэдр
turkeevmДата: Четверг, 21.08.2008, 01:18 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
Написал ради интереса простенький набор функций для 3d графики, и решил проверить на Мидлет Паскале. Все работает. Как на эмуле, так и на старом добром Motorola C380.

Вот исходник

Code
program Simple3d;

type
   T3dPoint=record
    x,y,z:real;
   end;
     
   T2dPoint=record
    x,y:real;
   end;

var fx,fy,fz:real;

function Round(x:real):integer;
begin
   Round:=Trunc(x);
   if ((Trunc(x)+0.5)<x) then
    Round:=Trunc(x)+1;
end;

function GetScreenProection(P:T3dPoint):T2dPoint;
var buf:T2dPoint;
begin
   buf.x:=fx-fz*(P.x-fx)/(P.z-fz);
   buf.y:=fy-fz*(P.y-fy)/(P.z-fz);
   GetScreenProection:=buf;
end;

procedure ClearDevice;
begin
   SetColor(0,0,0);
   FillRect(0,0,GetWidth,GetHeight);
end;

procedure Line(A,B:T2dPoint);
begin
   DrawLine(Round(A.x),
            Round(A.y),
            Round(B.x),
            Round(B.y));
end;

procedure Line3d(A,B:T3dPoint);
begin
   Line(GetScreenProection(A), GetScreenProection(B));
end;

function Rotation(X,O:T3dPoint; alpha, beta:real):T3dPoint;
var   
   vector:T3dPoint;
   buf:T3dPoint;
begin
   vector.x:=X.x-O.x;
   vector.y:=X.y-O.y;
   vector.z:=X.z-O.z;
     
   buf.x:=O.x+cos(alpha)*vector.x+sin(alpha)*vector.z;
   buf.y:=O.y+vector.y;
   buf.z:=O.z-sin(alpha)*vector.x+cos(alpha)*vector.z;

   vector.x:=buf.x-O.x;
   vector.y:=buf.y-O.y;
   vector.z:=buf.z-O.z;

   buf.x:=O.x+vector.x;
   buf.y:=O.y+cos(beta)*vector.y-sin(beta)*vector.z;
   buf.z:=O.z+sin(beta)*vector.y+cos(beta)*vector.z;
     
   Rotation:=buf;
end;

const pause=50;

var
   x_angle,
   y_angle:real;
   i,j:integer;
   A,B,C,D,O:T3dPoint;

begin
   x_angle:=Pi/30;
   y_angle:=-Pi/40;
     
   O.x:=GetWidth div 2;
   O.y:=GetHeight div 2;
   O.z:=60;
     
   fx:=O.x;
   fy:=O.y;
   fz:=-800;
     
   A.x:=O.x;      A.y:=O.y-50; A.z:=O.z;
   B.x:=O.x-41;   B.y:=O.y+17; B.z:=O.z-28;
   C.x:=O.y+41;   C.y:=O.y+17; C.z:=O.z-28;
   D.x:=O.x;      D.y:=O.y+17; D.z:=O.z+56;
     
   repeat
     ClearDevice;
//   SetColor(255,0,0);
//   Line3d(O,A);
//   Line3d(O,B);
//   Line3d(O,C);
//   Line3d(O,D);    
     SetColor(0,255,0);
     Line3d(A,B);
     Line3d(A,C);
     Line3d(A,D);
     Line3d(B,C);
     Line3d(C,D);
     Line3d(D,B);
      
     A:=Rotation(A,O,x_angle,y_angle);
     B:=Rotation(B,O,x_angle,y_angle);
     C:=Rotation(C,O,x_angle,y_angle);
     D:=Rotation(D,O,x_angle,y_angle);
       
    Repaint;
    Delay(pause);
   until false;
     
end.


Сообщение отредактировал turkeevm - Четверг, 21.08.2008, 01:20
 
IvinДата: Понедельник, 01.09.2008, 19:09 | Сообщение # 2
Admin
Группа: Администраторы
Сообщений: 46
Репутация: 0
Статус: Offline
turkeevm, очень мне твой алгоритм напоминает точно такой же из книги "Занимательное программирование". Не знаешь почему?
 
turkeevmДата: Четверг, 04.09.2008, 14:54 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
Понятия не имею. Я придумал первую его часть сам еще в девятом классе не могу сказать, что это было просто (проекция 3d точки на плоскость).
А вторую придумал уже в универе. Чистая линейная алгебра. Там просчитываются две матрицы поворота.

А про такую книжку впервые слышу.
Если все еще не веришь, могу рассказать как работает каждая строка кода.

 
ger1234567Дата: Суббота, 06.09.2008, 16:11 | Сообщение # 4
Рядовой
Группа: Проверенные
Сообщений: 7
Репутация: 0
Статус: Offline
Прикольно но Mascot Capsule 3D Лучше и прощще!
 
IvinДата: Суббота, 06.09.2008, 19:04 | Сообщение # 5
Admin
Группа: Администраторы
Сообщений: 46
Репутация: 0
Статус: Offline
turkeevm, да это элементарно. Даже впервые увидев этот код любой человек немного знающий математику и программирование без труда опишет каждую строчку.
Все это действительно почти везде описывается примерно так же, и вполне вероятно что ты это написал сам, просто похоже очень сильно, вот я и спросил.
ЗЫ а почему не полигоны?
 
turkeevmДата: Понедельник, 08.09.2008, 11:12 | Сообщение # 6
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
Quote (Ivin)
ЗЫ а почему не полигоны?

Вообще-то это я зря сказал, что оно очень хорошо работает на телефоне. На самом деле оно слегка тормозит. Видно синусы очень уж емкая штука. В смысле времени кушают много. Так что какие уж тут полигоны.
Хотя если речь идет о статичной каринке, то можно и помучиться.
Quote (ger1234567)
Прикольно но Mascot Capsule 3D Лучше и прощще!

Соль в том, что хотелось написать самому что-нибудь эдакое... не для пользы дела, а для собственного удовлетворения.


Сообщение отредактировал turkeevm - Понедельник, 08.09.2008, 11:19
 
IvinДата: Вторник, 09.09.2008, 08:38 | Сообщение # 7
Admin
Группа: Администраторы
Сообщений: 46
Репутация: 0
Статус: Offline
turkeevm, можно синусы/косинусы заменить массивом значений, так быстрее работает, но немного кривоватее и нужно переходить на градусы.
Примерно так
SinMas(round(alphf*180)); - по моему будет работать быстре чем просто синус.
 
turkeevmДата: Вторник, 09.09.2008, 14:22 | Сообщение # 8
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
Вообще я думал о том, чтобы попробовать формулу Тейлора, но с маленькой точностью. Для небольших углов может и прокатит.

Добавлено (09.09.2008, 14:22)
---------------------------------------------
В общем вставил ЭТО:

Code
function TlrSin(x:real):real;
begin
  TlrSin:=x*(1-0.6667*sqr(x)*(1-0.05*sqr(x)));
end;

function TlrCos(x:real):real;
begin
  TlrCos:=1-0.5*sqr(x)*(1-0.08333*sqr(x)*(1-0.03333*sqr(x)));
end;

стало быстрее, но точность... просто отвратительно
 
IvinДата: Вторник, 09.09.2008, 17:32 | Сообщение # 9
Admin
Группа: Администраторы
Сообщений: 46
Репутация: 0
Статус: Offline
Quote (turkeevm)
попробовать формулу Тейлора
,
меня от одного этого имени в дрож бросает biggrin
Quote (turkeevm)
стало быстрее, но точность... просто отвратительно

Она не правильно работает, во всяком случае обычный кружок нарисовать не вышло:
Code

   for r:=1 to round(pi*2*90) do
   begin
   y:=100+TlrCos(r/90)*50;
   x:=100+TlrSin(r/90)*50;
   form1.Canvas.Ellipse(round(x)-4,round(y)-4,round(x)+4,round(y)+4);
   end;

ЗЫ Это Делфи.
 
turkeevmДата: Понедельник, 15.09.2008, 14:45 | Сообщение # 10
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
Я ж говорю только для маленьких углов. Тоесть где-то от -Pi/3 до Pi/3 если не меньше А в моей проге поворот вообще постоянный на Pi/30 и на Pi/40

Сообщение отредактировал turkeevm - Понедельник, 15.09.2008, 14:47
 
ger1234567Дата: Четверг, 25.09.2008, 16:19 | Сообщение # 11
Рядовой
Группа: Проверенные
Сообщений: 7
Репутация: 0
Статус: Offline
чуваки говорите тормозит попробуйте Mascot Capsule 3D вот оно не тормозит
 
turkeevmДата: Среда, 15.10.2008, 00:40 | Сообщение # 12
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
Ну что ты блин пристал со своим Mascot! Знашь сколько он памяти хавает! Да на Motorola C380 он в жизни не запустится. Кроме того исходники есть только на java а я ее не знаю. Вот.
 
ger1234567Дата: Пятница, 17.10.2008, 16:07 | Сообщение # 13
Рядовой
Группа: Проверенные
Сообщений: 7
Репутация: 0
Статус: Offline
он ок работает только на телефонах Nokia Sony Ericsson а все остальное отстой на том не умеет на том не поддержует у меня Sony ericsson K750i даже не виснет на 3d гре Reilly master pro если ты слыхал о такой если хочеш знать про Mascot Capsule 3D это в формате M3g фирма Mascot подробная информация на developer.sonyericsson.com там усе найдеш и еще M3g можно создавать в 3ds max , milk shape , и другие.
 
Форум » MIDletPascal » Для новичков » простой и красивый 3d-тетраэдр
  • Страница 1 из 1
  • 1
Поиск: