Вверх ↑
Этот топик читают: Гость
Ответов: 1343
Рейтинг: 31
#1: 2021-02-20 19:23:22 ЛС | профиль | цитата
Есть ли варианты отрисовки обычной точки на картинке с точностью до 0.0000001...., а не как представлено в компоненте Point только по целым числам?

Например если трансформацией сдвигать картинку, то там точность с запятой возможна, но это целиковая картинка, а как поступить если это точка, которая постоянно перерисовывается на на этой картинке?

Редактировалось 2 раз(а), последний 2021-02-20 19:25:33
карма: 2

0
Ответов: 8921
Рейтинг: 823
#2: 2021-02-20 20:47:23 ЛС | профиль | цитата
Rysik, ну как всегда неясно излагаете хотелки
Сделайте трёхмерный массив double (высота, ширина и три цвета) и работайте с ним. при выводе на экран округляйте в integer. Например картинка 256х192 запишется в массив Pic[0..255, 0..191. 0..2] As double
В начале в двух координатах значения будут будут совпадать с номерами пикселей, ну а после расчёта будут с трчностью до 14 десятичных знаков. С цветом надо следить, чтобы не вышел за пределы 0-:-255.
карма: 19

0
Ответов: 1343
Рейтинг: 31
#3: 2021-02-20 21:19:05 ЛС | профиль | цитата
Rysik писал(а):
Rysik, ну как всегда неясно излагаете хотелки


да, это да))))

Леонид писал(а):
Сделайте трёхмерный массив double (высота, ширина и три цвета) и работайте с ним. при выводе на экран округляйте в integer. Например картинка 256х192 запишется в массив Pic[0..255, 0..191. 0..2] As double
В начале в двух координатах значения будут будут совпадать с номерами пикселей, ну а после расчёта будут с трчностью до 14 десятичных знаков. С цветом надо следить, чтобы не вышел за пределы 0-:-255.


ничего не понял)))


Add(MainForm,2953706,21,105)
{
Width=450
Height=477
}
Add(PaintBox,10240805,231,161)
{
Width=50
Height=50
Color=0
ClearBeforeDraw=0
Point(onPaint)
link(onBeforeDraw,5703441:doDraw,[])
}
Add(Timer,12776,182,161)
{
Interval=0
link(onTimer,10240805:doRefresh,[])
}
Add(Img_Point,5703441,434,161)
{
Color=65280
Size=3
Point(X)
Point(Y)
Point(Transform)
link(onDraw,15989258:doDraw,[])
link(Bitmap,7493472:getVar,[])
link(X,9559049:Count,[(447,117)(377,117)])
link(Y,14158608:Count,[(454,117)(482,117)])
}
Add(LineBreakEx,7493472,434,133)
{
Caption="bmp"
Type=2
}
Add(LineBreakEx,2355599,231,203)
{
Caption="bmp"
Type=3
link(_Data,10240805:Bitmap,[])
}
Add(Timer,11092191,315,42)
{
Interval=400
link(onTimer,9559049:doNext,[])
}
Add(CounterEx,9559049,371,42)
{
Max=50
link(onNext,11897398:doTimer,[])
}
Add(CounterEx,14158608,476,42)
{
Max=50
link(onNext,537872:doTimer,[])
}
Add(Timer,11897398,420,42)
{
Interval=1
Enable=1
AutoStop=1
link(onTimer,14158608:doNext,[])
}
Add(Img_Point,15989258,658,161)
{
Color=65280
Size=3
Point(X)
Point(Y)
Point(Transform)
link(Bitmap,4013458:getVar,[])
link(X,16222458:Count,[(671,117)(601,117)])
link(Y,10010829:Count,[(678,117)(706,117)])
}
Add(LineBreakEx,4013458,658,133)
{
Caption="bmp"
Type=2
}
Add(CounterEx,16222458,595,42)
{
Max=50
Direct=1
link(onNext,6742032:doTimer,[])
}
Add(CounterEx,10010829,700,42)
{
Max=50
Direct=1
}
Add(Timer,6742032,644,42)
{
Interval=1
Enable=1
AutoStop=1
link(onTimer,10010829:doNext,[])
}
Add(Timer,537872,539,42)
{
Interval=1
Enable=1
AutoStop=1
link(onTimer,16222458:doNext,[])
}
Add(PaintBox,1132952,203,434)
{
Left=65
Width=50
Height=50
Color=0
ClearBeforeDraw=0
Point(onPaint)
link(onBeforeDraw,14860219:doEvent1,[])
}
Add(Timer,3856851,154,434)
{
Interval=0
link(onTimer,1132952:doRefresh,[])
}
Add(Img_Point,510685,406,434)
{
X=20
Y=20
Color=65280
Size=3
Point(X)
Point(Y)
Point(Transform)
link(onDraw,16363929:doDraw,[])
link(Bitmap,9154436:getVar,[])
}
Add(LineBreakEx,9154436,406,406)
{
Caption="bmp2"
Type=2
}
Add(LineBreakEx,13034508,203,476)
{
Caption="bmp2"
Type=3
link(_Data,1132952:Bitmap,[])
}
Add(Img_Point,16363929,630,434)
{
X=35
Y=35
Color=65280
Size=3
Point(X)
Point(Y)
Point(Transform)
link(Bitmap,15770649:getVar,[])
}
Add(LineBreakEx,15770649,630,406)
{
Caption="bmp2"
Type=2
}
Add(Img_UseOffset,4380928,315,336)
{
link(X,13037737:Var2,[])
link(Y,13037737:Var3,[(335,314)])
}
Add(Img_SetTransform,12293127,294,434)
{
link(onSetTransform,510685:doDraw,[])
link(Bitmap,10256678:getVar,[])
link(Transform,4380928:Transform,[])
}
Add(Hub,14860219,252,434)
{
link(onEvent1,12293127:doSetTransform,[])
link(onEvent2,12293127:doResetTransform,[])
}
Add(LineBreakEx,10256678,294,406)
{
Caption="bmp2"
Type=2
}
Add(Math,3693233,308,259)
{
OpType=32
}
Add(CounterEx,5162668,245,259)
{
Direct=1
link(onNext,3693233:doOperation,[])
}
Add(Timer,15323109,189,259)
{
Interval=0
link(onTimer,5162668:doNext,[])
}
Add(GetDataEx,13037737,322,309)
{
Angle=3
link(Data,3693233:Result,[(314,314)])
}

вот пример, тут при маленькой частоте передвижения точки, она двигается ступеньками, а надо что бы двигалась очень плавно как на втором примере, но на втором примере, двигается всё полностью, а не каждая точка отдельно
карма: 2

0
Ответов: 8921
Рейтинг: 823
#4: 2021-02-20 23:44:19 ЛС | профиль | цитата
Rysik, картинки в компьютере не аналоговые, а растровые и передвинуть точку можно не менее, чем на целое число пикселей. А играть переливанием цвета -- считать замучаетесь


Add(MainForm,10166470,357,49)
{
Left=300
Top=200
link(onCreate,4352979:doCreate,[])
}
Add(Img_Point,5703441,238,196)
{
Color=16711680
Size=16
Point(X)
Point(Y)
link(onDraw,15989258:doDraw,[])
link(Bitmap,12608432:Var1,[(244,173)])
link(X,8703955:Count,[(251,166)(209,166)])
link(Y,7066475:Count,[])
}
Add(Timer,11092191,112,119)
{
Interval=10
link(onTimer,4798535:doEvent1,[])
}
Add(Img_Point,15989258,336,196)
{
Color=255
Size=16
Point(X)
Point(Y)
link(onDraw,708838:doRefresh,[(401,202)(401,146)])
link(Bitmap,12608432:Var2,[])
link(X,13315843:Count,[(349,166)(307,166)])
link(Y,915761:Count,[])
}
Add(Counter,8703955,203,126)
{
Max=127
link(onNext,7066475:doNext,[])
}
Add(Counter,7066475,252,126)
{
Max=127
link(onNext,13315843:doPrev,[(291,132)(291,139)])
}
Add(Counter,13315843,301,126)
{
Max=127
link(onNext,915761:doPrev,[(340,132)(340,139)])
}
Add(Counter,915761,350,126)
{
Max=127
link(onNext,5703441:doDraw,[(389,132)(389,223)(228,223)(228,202)])
}
Add(Image,708838,413,126)
{
Left=135
Top=55
Width=128
Height=128
Point(doRefresh)
link(Bitmap,4352979:Bitmap,[])
}
Add(Bitmap,4352979,413,49)
{
HWidth=128
HHeight=128
FillColor=12639424
Point(doCreate)
}
Add(Hub,4798535,161,119)
{
link(onEvent1,708838:doLoad,[(186,125)(186,118)(404,118)(404,132)])
link(onEvent2,8703955:doNext,[])
}
Add(GetDataEx,12608432,336,168)
{
Angle=1
link(Data,708838:ImageBitmap,[(419,173)])
}

карма: 19

0
Ответов: 1343
Рейтинг: 31
#5: 2021-02-20 23:57:33 ЛС | профиль | цитата
Леонид писал(а):
Rysik, картинки в компьютере не аналоговые, а растровые и передвинуть точку можно не менее, чем на целое число пикселей. А играть переливанием цвета -- считать замучаетесь



а ничего и не поменялось))), всё работает так же ступеньками, тут не нужно частоту 10мс, а частоту даже 1000мс и сразу будет заметно что точка двигается ступеньками по 1 пикселю, а вот если заюзать трансформацию и сдвиг то там уже оно как то оооочень плавно идёт
карма: 2

0
Ответов: 2236
Рейтинг: 676
#6: 2021-02-21 10:59:15 ЛС | профиль | цитата
Rysik, скачайте книгу Delphi Графика в проектах (Дмитрий Осипов) и прочтите в 11 главе "Общие характеристики режимов отображения". Там полный ответ на ваш вопрос.

А так элементы трансформации и были сделаны для того чтоб решить этот вопрос. Это конечно не единственный возможный вариант, но с вашей задачей вполне справится.

Add(MainForm,3511061,119,140)
{
Width=450
Height=477
Position=1
}
Add(PaintBox,10240805,343,259)
{
Width=50
Height=50
Color=0
ClearBeforeDraw=0
Point(onPaint)
link(onBeforeDraw,5703441:doDraw,[])
}
Add(Img_Point,5703441,392,259)
{
Color=65280
Size=3
Point(X)
Point(Y)
Point(Transform)
link(onDraw,15989258:doDraw,[])
link(Bitmap,7493472:getVar,[])
link(X,9559049:Count,[])
link(Y,14158608:Count,[(412,215)(447,215)])
}
Add(LineBreakEx,7493472,392,231)
{
Caption="bmp"
Type=2
}
Add(LineBreakEx,2355599,343,301)
{
Caption="bmp"
Type=3
link(_Data,10240805:Bitmap,[])
}
Add(Timer,11092191,350,140)
{
Interval=290
link(onTimer,9559049:doNext,[])
}
Add(CounterEx,9559049,399,140)
{
Max=50
link(onNext,14158608:doNext,[])
}
Add(CounterEx,14158608,441,140)
{
Max=50
link(onNext,16222458:doNext,[])
}
Add(Img_Point,15989258,476,259)
{
Color=65280
Size=3
Point(X)
Point(Y)
Point(Transform)
link(Bitmap,4013458:getVar,[])
link(X,16222458:Count,[])
link(Y,10010829:Count,[(496,215)(531,215)])
}
Add(LineBreakEx,4013458,476,231)
{
Caption="bmp"
Type=2
}
Add(CounterEx,16222458,483,140)
{
Max=50
Direct=1
link(onNext,10010829:doNext,[])
}
Add(CounterEx,10010829,525,140)
{
Max=50
Direct=1
link(onNext,10240805:doRefresh,[(577,146)(577,327)(323,327)(323,265)])
}
Add(PaintBox,1132952,329,532)
{
Left=65
Width=50
Height=50
Color=0
ClearBeforeDraw=0
Point(onPaint)
link(onBeforeDraw,510685:doDraw,[])
}
Add(Img_Point,510685,371,532)
{
Color=65280
Size=3
Point(X)
Point(Y)
Point(Transform)
link(onDraw,16363929:doDraw,[])
link(Bitmap,9154436:getVar,[])
link(Transform,14568100:Transform,[])
}
Add(LineBreakEx,9154436,371,504)
{
Caption="bmp2"
Type=2
}
Add(LineBreakEx,13034508,329,574)
{
Caption="bmp2"
Type=3
link(_Data,1132952:Bitmap,[])
}
Add(Img_Point,16363929,434,532)
{
X=50
Y=50
Color=65280
Size=3
Point(X)
Point(Y)
Point(Transform)
link(Bitmap,15770649:getVar,[])
link(Transform,4380928:Transform,[])
}
Add(LineBreakEx,15770649,434,504)
{
Caption="bmp2"
Type=2
}
Add(Img_UseOffset,4380928,455,462)
{
link(X,2850402:Var2,[])
link(Y,2850402:Var3,[(475,439)])
}
Add(Math,3693233,462,385)
{
OpType=2
Op2=-1
link(onResult,1132952:doRefresh,[(522,391)(522,602)(317,602)(317,538)])
AddHint(16,-18,33,13,Op2)
}
Add(CounterEx,5162668,357,385)
{
Max=5000
link(onNext,16360056:doOperation,[])
}
Add(GetDataEx,2850402,462,434)
{
link(Data,3693233:Result,[])
}
Add(Img_UseOffset,14568100,392,462)
{
link(X,10106676:Var2,[])
link(Y,10106676:Var3,[(412,439)])
}
Add(Math,16360056,399,385)
{
OpType=3
Op2=10
link(onResult,3693233:doOperation,[])
AddHint(16,-18,36,13,Op2)
}
Add(GetDataEx,10106676,399,434)
{
link(Data,16360056:Result,[])
}
Add(Timer,1360580,315,385)
{
Interval=30
link(onTimer,5162668:doNext,[])
}
карма: 11

0
6
Сообщение
...
Прикрепленные файлы
(файлы не залиты)