САПР на Lazarus

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Re: САПР на Lazarus

Сообщение zub » 22.10.2017 18:34:05

>>Если хочешь использовать больше 6 цифр после запятой .. нужно переходить на тип Extended.
На гифке выше всё рисуется в double без extended. ладно, проехали
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение olegy123 » 22.10.2017 18:41:42

т.е.
1км=1000м=100000см=1000000мм
при масштабе в 1км -миллиметры будут терятся.. критическое измерение 10см.
так же наоборот при 1мм критично уже 100м.

zub писал(а):На гифке выше всё рисуется в double без extended. ладно, проехали

так на выходе в OpenGL там GLSingle

Добавлено спустя 5 минут 49 секунд:
Как видяха может посчитать в мм размеры в 1км имея всего лишь 6 цифр калькулятора..
olegy123
энтузиаст
 
Сообщения: 763
Зарегистрирован: 25.02.2016 12:10:20

Re: САПР на Lazarus

Сообщение zub » 22.10.2017 19:13:18

Ты рано хоронишь double, вот предел его точности. обрати внимание на порядок координат и длину отрезка
https://imgur.com/a/Xl6kG
вконце крестик курсора двигается скачками - он рисуется в пространстве модели, квадратик рисуется в координатах окна, поэтому не скачет
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение olegy123 » 22.10.2017 19:30:09

Выведи лог крестика..
явно он шагает.
при большом масштабе будет шагать больше..
пример :
single (1.234567e10) + single (12345) = single (1.234567e10)
А куда делись single (12345)?
Код: Выделить всё
x:=1.234567e30;
y:=1234567890;
for i:=0 to 1000000 do
x:=x+y;

на выходе будет все тот же x:=1.234567e30
А куда делись single (1234567890*1000000)?
а процессор их округлил..

Добавлено спустя 7 минут 7 секунд:
легко заметить, внизу statusbar показывает координаты? когда доходить до сотых - крестик начинает ходить.
olegy123
энтузиаст
 
Сообщения: 763
Зарегистрирован: 25.02.2016 12:10:20

Re: САПР на Lazarus

Сообщение zub » 22.10.2017 19:48:14

да он шагает, причем по Y, т.к. y в данном случае Y намного больше X, дискретность по нему заметней.
>>Выведи лог крестика..
повторяю, это очень старая версия - модель в double и отрисовка в double. canvas дравера еще нет.
сейчас модель в double, отрисовка в single и для canvas и для opengl.

Но спорим мы не изза этого. А изза того что без ухишьрений такое в GL не нарисовать, там предел наступает гораздо раньше. т.к. то что мы туда скармливаем внутри еще обрабатывается - умножается на матрицы
Последний раз редактировалось zub 22.10.2017 19:50:54, всего редактировалось 1 раз.
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение olegy123 » 22.10.2017 19:49:46

Я не знаю что там множится..
может по X предела пока нет..
увеличь на порядок масштаб..

Добавлено спустя 59 секунд:
http://www.delphibasics.co.uk/Article.asp?Name=Numbers
Single 4 7 significant digits, exponent -38 to +38
Currency 8 50+ significant digits, fixed 4 decimal places
Double 8 15 significant digits, exponent -308 to +308
Extended 10 19 significant digits, exponent -4932 to +4932


Добавлено спустя 53 секунды:
Extended +4 числа по сравнению с Double

Добавлено спустя 5 минут 8 секунд:
zub писал(а):Но спорим мы не изза этого. А изза того что без ухишьрений такое в GL не нарисовать, там предел наступает гораздо раньше. т.к. то что мы туда скармливаем внутри еще обрабатывается - умножается на матрицы

Спорим!!! Что на GL можно спокойно оперировать с графическими данными и Octuple-precision floating-point format (2.4824 × 10e-78913 1.6113 × 10e78913)
Точнее отображать их..
olegy123
энтузиаст
 
Сообщения: 763
Зарегистрирован: 25.02.2016 12:10:20

Re: САПР на Lazarus

Сообщение zub » 22.10.2017 19:57:25

>>Double 8 15 significant digits
на гифке по Y так и есть - "предел" на 15ти порядках

Добавлено спустя 6 минут 16 секунд:
Ну мою демку ты видел. Сделано это "не спокойно", присутствуют манипуляции как с матрицами так и с данными отправляемыми на рендер - а конкретно из всего вычитается центр виевфрустума (а может центр видимой геометрии, непомню точно), чтоб уменьшить числа и получается некоя локальная система координат с меньшим динамическим диапозоном. ЕМНИП.
Жду подобного от тебя, где гиганские числа будут тупо слаться на рендер, без всякой обработки. а че, 10e78913))
Последний раз редактировалось zub 22.10.2017 20:13:32, всего редактировалось 2 раз(а).
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение olegy123 » 22.10.2017 20:06:08

Ха.. там будут слаться GLSingle
olegy123
энтузиаст
 
Сообщения: 763
Зарегистрирован: 25.02.2016 12:10:20

Re: САПР на Lazarus

Сообщение zub » 22.10.2017 20:10:33

GLDouble. 2 отрезка как описано выше, жмем кнопку - смотрим на полэкрана один, жмем другую - смотрим на полэкрана другой. жмем третью смотрим всё сразу (в виде 2х точек).
Динамический zoom и pan - ненадо
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение olegy123 » 22.10.2017 20:16:34

Это спор?
olegy123
энтузиаст
 
Сообщения: 763
Зарегистрирован: 25.02.2016 12:10:20

Re: САПР на Lazarus

Сообщение zub » 22.10.2017 20:18:04

Это конец теоретика
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение olegy123 » 22.10.2017 22:43:20

спор.jpg
спор.jpg (6.08 КБ) Просмотров: 308

Код: Выделить всё
implementation
const
  line1:Array [0..1,0..1] of Extended =((10E10,10E10),(10E10+10,10E10+10));
  line2:Array [0..1,0..1] of Extended =((0,0),(10,10));
  x10e10:Extended=10e-10+0.0000000003;
  _maxInt:Integer=1000;
  _minInt:Integer=-1000;

{$R *.lfm}

{ TForm1 }


function fExtendedToInteger(x:Extended):Integer;
begin
   if x>_maxInt //High(Integer)
     then Result:=_maxInt //High(Integer)
   else
     if -x<_minInt //Low(Integer)
       then Result:=_minInt //Low(Integer)
     else
       Result:=trunc(x);
end;

procedure TForm1.Panel1Paint(Sender: TObject);
var
  pcx,pcy:Integer;
  l1:array [0..1,0..1] of Integer;
  l2:array [0..1,0..1] of Integer;
begin
   Panel1.Canvas.Pen.Color:=clBlack;
   Panel1.Canvas.Pen.Width:=10;
   Panel1.Canvas.Brush.Color:=clWhite;
   Panel1.Canvas.Clear;
   pcx:=Panel1.Width div 2;
   pcy:=Panel1.Height div 2;

   l1[0,0]:=fExtendedToInteger(line1[0,0]);
   l1[0,1]:=fExtendedToInteger(line1[0,1]);
   l1[1,0]:=fExtendedToInteger(line1[1,0]);
   l1[1,1]:=fExtendedToInteger(line1[1,1]);

   l2[0,0]:=fExtendedToInteger(line2[0,0]);
   l2[0,1]:=fExtendedToInteger(line2[0,1]);
   l2[1,0]:=fExtendedToInteger(line2[1,0]);
   l2[1,1]:=fExtendedToInteger(line2[1,1]);

   Panel1.Canvas.Pen.Color:=clBlue;
   Panel1.Canvas.MoveTo(pcx+l1[0,0],pcy-l1[0,1]);
   Panel1.Canvas.LineTo(pcx+l1[1,0],pcy-l1[1,1]);
   Panel1.Canvas.Pen.Color:=clRed;
   Panel1.Canvas.MoveTo(pcx+l2[0,0],pcy-l2[0,1]);
   Panel1.Canvas.LineTo(pcx+l2[1,0],pcy-l2[1,1]);


end;

procedure TForm1.Panel2Paint(Sender: TObject);
var
  pcx,pcy:Integer;
  l1:array [0..1,0..1] of Integer;
  l2:array [0..1,0..1] of Integer;
begin
   Panel2.Canvas.Pen.Color:=clBlack;
   Panel2.Canvas.Pen.Width:=10;
   Panel2.Canvas.Brush.Color:=clWhite;
   Panel2.Canvas.Clear;
   pcx:=Panel2.Width div 2;
   pcy:=Panel2.Height div 2;

   l1[0,0]:=fExtendedToInteger(line1[0,0]*x10e10);
   l1[0,1]:=fExtendedToInteger(line1[0,1]*x10e10);
   l1[1,0]:=fExtendedToInteger(line1[1,0]*x10e10);
   l1[1,1]:=fExtendedToInteger(line1[1,1]*x10e10);

   l2[0,0]:=fExtendedToInteger(line2[0,0]*x10e10);
   l2[0,1]:=fExtendedToInteger(line2[0,1]*x10e10);
   l2[1,0]:=fExtendedToInteger(line2[1,0]*x10e10);
   l2[1,1]:=fExtendedToInteger(line2[1,1]*x10e10);

   Panel2.Canvas.Pen.Color:=clBlue;
   Panel2.Canvas.MoveTo(pcx+l1[0,0],pcy-l1[0,1]);
   Panel2.Canvas.LineTo(pcx+l1[1,0],pcy-l1[1,1]);
   Panel2.Canvas.Pen.Color:=clRed;
   Panel2.Canvas.MoveTo(pcx+l2[0,0],pcy-l2[0,1]);
   Panel2.Canvas.LineTo(pcx+l2[1,0],pcy-l2[1,1]);

end;
olegy123
энтузиаст
 
Сообщения: 763
Зарегистрирован: 25.02.2016 12:10:20

Re: САПР на Lazarus

Сообщение zub » 22.10.2017 22:57:44

ндаа))...
1)опенгл?
>>Спорим!!! Что на GL можно спокойно...

2)Под спокойно я понимаю
GlBegin(gllines);
GLVertex2D(0,0);
GLVertex2D(10,10);
GLVertex2D(10e10,10e10);
GLVertex2D(10e10+10,10e10+10);
GlEnd;
так должно выглядеть для всех панелей, а подгон отрезков под экран - будь добр матрицами

Добавлено спустя 4 минуты 54 секунды:
GLVertex2D(10e10*K,10e10*K);
или
GLVertex2D(10e10+-L,10e10+-L);
это уухищьрения, т.к. K или L должны считаться динамически под конкретные данные видимые в конкретном кадре
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение olegy123 » 22.10.2017 23:04:28

Даже не OpenGL а простой Integer с диапазоном (-1000..1000)

Добавлено спустя 1 минуту 12 секунд:
Можно уменьшит и до [-64..64] тогда получим 128х128
olegy123
энтузиаст
 
Сообщения: 763
Зарегистрирован: 25.02.2016 12:10:20

Re: САПР на Lazarus

Сообщение zub » 22.10.2017 23:09:08

>>Даже не OpenGL
У тебя талант.
Прикинь, а нужен OpenGL. и расчет точек на GPU. Иначе нафиг оно нужно, считали бы на СPU и слали бы на видяху уже в экранных координатах
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru