forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   2d сетка (http://forum.boolean.name/showthread.php?t=17416)

polopok 23.10.2012 19:00

2d сетка
 
вопрос как реализовать подобную сетку в 2д так чтоб можно было
по координатам мыши вычислить номера ячейки при клике

возможно у вас есть идеи ,предложения по реализации...

polopok 23.10.2012 19:34

Ответ: 2d сетка
 
в принципе всё до чего я додумался ...
вот примеры кода:
Код:

Graphics 800,600 ,32,
SetBuffer BackBuffer()


While Not KeyHit(1)
        Cls
Xoffset# = -10
py =0
For map_pointY = 0 To 12
        py= py+1
        px =0
        Xoffset# = Xoffset# -.5
        For map_pointX# = -6 To 6
                px = px +1
                Color 255,255,255
                Plot  400  + (map_pointX*3.5*Xoffset# )  ,  30+ map_pointY*30
                Text  400  + (map_pointX*3.5*Xoffset# )  ,  30+ map_pointY*30 , px +" "+py
        Next
Next
Flip
Wend
End



другой вариант ;

Код:

Graphics 800,600,32,2
SetBuffer BackBuffer()
x = 20
y = 40
z = 50
z2 =30
k =16
FOV = 400
dist =100
Dim tx(k) : Dim ty(k) : Dim tz(k)

Restore dats
For i = 1 To k
        Read x,y,z
        tx(i)=x
        ty(i)=y
        tz(i)=z
Next
HidePointer
While Not KeyHit(1)
Cls ; Сначала очищаем экран
mx = MouseX()-200 : my= MouseY()

For i=1 To k
 ;  sx = 400+tx(i)*dist/Float(tz(i)+dist)
 ;  sy = 300+ty(i)*dist/Float(tz(i)+dist)

sx = tx(i)*FOV/Float(tz(i)) +400
sy = ty(i)*FOV/Float(tz(i)) -200

x = mx*FOV/Float(200) +400
y = my*FOV/Float(200) -200

Text sx,sy,"."
Text x,y,"+"
;Text xx,yy,"2"
Next

Flip ; Меняем буфер
Wend
End

.dats
Data 0,0,0

Data 0,300,200
Data 20,300,200
Data -20,300,200

Data 20,300,220
Data -20,300,220
Data 0,300,220

Data 20,300,240
Data -20,300,240
Data 0,300,240

Data 20,300,260
Data -20,300,260
Data 0,300,260

Data 20,300,280
Data -20,300,280
Data 0,300,280


Жека 24.10.2012 06:41

Ответ: 2d сетка
 
Я бы использовал функцию, которая проверяет - находится ли точка внутри многоугольника. Каждую ячейку карты представить отдельными четырёхугольниками, задать координаты вершин по формуле, которая даёт ощущение перспективы.
Сама функция проверки у меня есть, если нужна скину.

Jlemyp 24.10.2012 08:30

Ответ: 2d сетка
 
Жека, скинь пожалуста.Мне тужно будет полезна эта функция.

polopok 24.10.2012 10:04

Ответ: 2d сетка
 
Цитата:

Сообщение от Жека (Сообщение 240986)
Я бы использовал функцию, которая проверяет - находится ли точка внутри многоугольника. Каждую ячейку карты представить отдельными четырёхугольниками, задать координаты вершин по формуле, которая даёт ощущение перспективы.
Сама функция проверки у меня есть, если нужна скину.

Да такая функция у меня есть (использую довольно часто ) ,все дело в том ,что сетка неравномерная ...
а так -то конечно .

polopok 24.10.2012 10:07

Ответ: 2d сетка
 
вот ссылка по теме :
http://board.flashkit.com/board/show...-3d-coordinate

увы ,разобраться в том коде никак не могу ,хоть и пытался переписать под blitz

polopok 24.10.2012 11:22

Ответ: 2d сетка
 
Так ! Вот получилось ... единственно X мыши неверно определяется :(
код:
Код:

Graphics 800,600
SetBuffer BackBuffer()


While Not KeyHit(1)
Cls
mx# = MouseX() : my# = MouseY()

For y = 1 To 13
        For x# = -6 To 6
                px# = ( (x*30)+(y*x))
                py# =  y*30
               
               
                If x<6
                Line 400 +px,py , 400 + ( (x+1)*30)+(y*(x+1)),py
                EndIf
                If y<13
                Line 400 +px,py , 400 + ( (x)*30)+((y+1)*(x)) ,(y+1)*30
                EndIf
        ;        Plot 400 + px, py
        ;        Text px ,py , Int(x)
        ;        Text px ,py+10 , y
        Next
Next


        xm# = Floor#( (mx/30)-((my/30)/(mx/30)))
        ym# = Floor#(my/30)

Text 20,20,Int(xm)
Text 20,40,Int(ym)
Flip
Wend
End


polopok 24.10.2012 19:10

Ответ: 2d сетка
 
Ну что ж ,можно праздновать победу . После долгих размышлений (проб и ошибок) ,все-таки нашел решение (правда в правом верхнем и левом нижнем углах ячейки заметно не правильные результаты ,всего несколько пикселов, думаю этим можно пренебречь ) .
Вот выкладываю готовый код:
Код:

Graphics 800,600 ,32,2
SetBuffer BackBuffer()
tile_sizeX = 50
tile_sizeY = 30

ClsColor 34 ,139 ,34 
While Not KeyHit(1)
Cls
mx# = MouseX() : my# = MouseY()

For y = 1 To 11 ;Step 1
        For x# = 1 To 11
                px# = ((x-6)*tile_sizeX )+(y*(x-6))
                py# =  y*tile_sizeY
               
                Color 3 ,35, 3
                If x<11
                Line 400 + px,py , 400 +  ( (x-5)*tile_sizeX )+(y*(x-5)),py
                Text 400 +px+20 ,py+5 , Int(x)
                EndIf
                If y<11
                Line 400 + px,py , 400 +  ( (x-6)*tile_sizeX )+((y+1)*(x-6)) ,(y+1)*tile_sizeY
                Text 400 +px+20 ,py+15 , Int(y)
                EndIf
               
        ;        Plot 400 + px,  py
               
               
        ;        Text 400 + px ,py , (y*x)
        ;        Text 400 +px ,py , px
        Next
Next

        ym# = Floor#(my/tile_sizeY )
        xm# = Floor#(    ( mx-400)/(tile_sizeX+ym+0.5)+6)


                Text mx,my-10,Int(xm) +" : "+Int(ym)
                Text mx,my,"\"

                Text 20,20,"MouseX : "+Int(mx)+" MouseY : "+Int(my)
                Text 20,40,"X : "+Int(xm)
                Text 20,60,"Y : "+Int(ym)
Flip
Wend
End



возможно кому-нибудь пригодится ...

moka 24.10.2012 19:14

Ответ: 2d сетка
 
Реализуй простую сетку без перспективы. А затем x координату для отрисовки линий и вычисления ячейки на которую наводишь умножай на коэффициент перспективы который зависит от Y.
Готово.

polopok 24.10.2012 23:33

Ответ: 2d сетка
 
Цитата:

Сообщение от MoKa (Сообщение 241023)
Реализуй простую сетку без перспективы. А затем x координату для отрисовки линий и вычисления ячейки на которую наводишь умножай на коэффициент перспективы который зависит от Y.
Готово.

Вот что значит правильная идея(подход) ,пара минут и готово решение . :)
Выкладываю то , что получилось
код:
Код:

Graphics 800,600
SetBuffer BackBuffer()
TileSizeX = 40
TileSizeY = 30
fov# = 50
While Not KeyHit(1)
Cls
mx# = MouseX() : my# = MouseY()

        For y = 1 To 11
                For x = -5 To 5
                        ScaleRatio# = fov/(fov+y)
                        px# = x*TileSizeX/ScaleRatio
                        py# = y*TileSizeY
                       
                        If x<5 Then Line 400+px , py ,400+ ((x+1)*TileSizeX/ScaleRatio) , py
                        If y<11 Then Line 400+px , py ,400+ ((x)*TileSizeX/(fov/(fov+(y+1)))) , (y+1)*TileSizeY
        ;                Plot 400+px , py
                Next
        Next       
       
        ym# = Floor#(my/TileSizeY)
        xm# = Floor#((  (mx-400)/ TileSizeX*( (fov/(fov+ym)))+6 ))
       
        If xm<11 And xm >0 And ym <11 And ym >0
                Text mx,my-10,Int(xm)+" : "+Int(ym)
        End If
                Text 20,40,"X : "+Int(xm)
                Text 20,60,"Y : "+Int(ym)       
Flip
Wend
End


Жека 26.10.2012 08:19

Ответ: 2d сетка
 
Цитата:

Сообщение от Jlemyp (Сообщение 240987)
Жека, скинь пожалуста.Мне тужно будет полезна эта функция.

У меня код под блитц макс был изначально, выложу его тоже.
В блитц 3д нельзя в функцию передать массив, поэтому я сделал в примере передачу объекта TArray, содержащего массив (статический, к сожалению).

Blitz3D:
Код:

;создадим квадратный полигон
;1----2
;|    |
;|    |
;4----3
Local poly.TArray = New TArray
poly\array[0] = 0 ;x1
poly\array[1] = 0 ;x2
poly\array[2] = 1
poly\array[3] = 0
poly\array[4] = 1
poly\array[5] = 1
poly\array[6] = 0 ;x4
poly\array[7] = 1 ;y4
poly\count = 8

DebugLog "test (-1,0): "+pointInPoly(poly, -1, 0)
DebugLog "test (0.5,0.5): "+pointInPoly(poly, 0.5, 0.5)
DebugLog "test (0.999,0.999): "+pointInPoly(poly, 0.999, 0.999)
Stop
End


;проверка находится ли точка внутри многоугольника
;многоугольник должен быть выпуклый (вогнутые можно заменить несколькими выпуклыми)
;алгоритм: делается обход отрезков многоугольника по часовой стрелке
;и проверяется - лежит ли точка "справа"(внутри) от каждого из отрезков
Function pointInPoly%(array.TArray, px#, py#)
       
        If(array = Null) Then Return False
       
        Local x1#, y1#, x2#, y2#
        Local koef#, koefA#
        Local k%, cnt% = array\count-1
        Local in = True
        Local sign, sign2
        DebugLog "px,py: "+px+","+py
       
        For k = 0 To cnt Step 2
                x1 = array\array[k]
                y1 = array\array[k+1]
                If(k + 3 < cnt)
                        x2 = array\array[k + 2]
                        y2 = array\array[k + 3]
                Else                ; "замыкаем" с первой точкой
                        x2 = array\array[0]
                        y2 = array\array[1]
                EndIf
               
                sign = Sgn(x2 - x1)
                sign2 = Sgn(px - x1)
               
                DebugLog "x1,y1: "+x1+","+y1
                DebugLog "x2,y2: "+x2+","+y2
               
                ;исключаем деление на ноль
                If(sign = 0)
                        x2 = x2+0.01
                        sign = 1
                EndIf
                If(sign2 = 0)
                        px = px+0.01
                        sign2 = 1
                EndIf
               
                ;коэффициенты наклона отрезков (y = k*x + b)
                koef = (y1 - y2) / (x2 - x1)
                koefA = (y1 - py) / (px - x1)
                DebugLog "koef: "+koef
                DebugLog "koefA: "+koefA
                ;сама проверка: коэффициен наклона проверяемого отрезка должен быть
                ;больше чем отрезка с точкой (px,py) при условии что координаты (x2,y2) и (px,py)
                ;лежат по одну сторону от точки (x1,x2)
                ;если по разные стороны, то наклон исходного должен быть меньше
                If((sign2 = sign And koefA > koef) Or (sign2 <> sign And koefA < koef))
                        in = False
                        Exit
                EndIf
               
        Next
       
        Return in
       
End Function


Type TArray
        Field array#[100]
        Field count%
End Type



BlitzMax:
Код:

Local xy#[] = [0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0]

DebugLog "test (-1,0): "+pointInPoly(xy, -1, 0)
DebugLog "test (0.5,0.5): "+pointInPoly(xy, 0.5, 0.5)
DebugLog "test (0.999,0.999): "+pointInPoly(xy, 0.999, 0.999)

DebugStop
End


'проверка находится ли точка внутри многоугольника
'многоугольник должен быть выпуклый
'алгоритм: делается обход отрезков многоугольника по часовой стрелке
'и проверяется - лежит ли точка "справа"(внутри) от каждого из отрезков
Function pointInPoly%(xy:Float[], px:Float, py:Float)
       
        If(xy = Null) Then Return
       
        Local x1:Float, y1:Float, x2:Float, y2:Float
        Local koef:Float, koefA:Float
        Local k, cnt = xy.Dimensions()[0]
        Local in = True
        Local sign, sign2
       
        For k = 0 Until cnt Step 2
                x1 = xy[k]
                y1 = xy[k + 1]
                If(k + 3 < cnt)
                        x2 = xy[k + 2]
                        y2 = xy[k + 3]
                Else                ' "замыкаем" с первой точкой
                        x2 = xy[0]
                        y2 = xy[1]
                EndIf
               
                sign = Sgn(x2 - x1)
                sign2 = Sgn(px - x1)
               
                'исключаем деление на ноль
                If(sign = 0)
                        x2:+0.01
                        sign = 1
                EndIf
                If(sign2 = 0)
                        px:+0.01
                        sign2 = 1
                EndIf
               
                'коэффициенты наклона отрезков (y = k*x + b)
                koef = (y1 - y2) / (x2 - x1)
                koefA = (y1 - py) / (px - x1)
               
                'сама проверка: коэффициен наклона проверяемого отрезка должен быть
                'больше чем отрезка с точкой (px,py) при условии что координаты (x2,y2) и (px,py)
                'лежат по одну сторону от точки (x1,x2)
                'если по разные стороны, то наклон исходного должен быть меньше
                If((sign2 = sign And koefA > koef) Or (sign2 <> sign And koefA < koef))
                        in = False
                        Exit
                EndIf
       
        Next
       
        Return in
       
End Function


Можно в "полезные функции" скинуть, наверное.

polopok 16.05.2014 14:42

Ответ: 2d сетка
 
После долгого отсутствия ...
Вот код , переделана математическая часть ,что по моему мнению стало лучше ,как читабельно ,так и в понимании .Думаю код будет полезен .

Код:

;
Const ttx = 40 , tty = 30 , KolvoBlock= 13 , GrX = 330 , GrY = 50
Dim MapX(KolvoBlock,KolvoBlock) ,  MapY(KolvoBlock,KolvoBlock) ,MapCenterX(KolvoBlock,KolvoBlock) ,  MapCenterY(KolvoBlock,KolvoBlock) ,map(KolvoBlock,KolvoBlock)

Graphics 800,600,32,2
SetBuffer BackBuffer()

For y = 0 To KolvoBlock
        For x = 0 To KolvoBlock
                px# =( x-5)*(ttx+(y)) ;-5
                py# = y*tty
                pcx# =(( x-5)*(ttx+y)) +(ttx/2+(y/2))
                pcy# =y*(tty)+tty/2
               
                MapX(x,y) = px
                MapY(x,y) = py
               
                If y<KolvoBlock And x<KolvoBlock Then
                        MapCenterX(x,y) = pcx
                        MapCenterY(x,y) = pcy       
                EndIf       
        Next
Next
;Origin 200,100
ClsColor 150,150,150
While Not KeyHit(1)
Cls
mx# = MouseX() : my# = MouseY()
        ty = Int(Floor( (my-GrY )/tty ))
        tx = Int(Floor( ((mx-GrX ) / (ttx+(ty)))) +5 );
Draw()

;Line mx-100,0,mx-100,500
If tx>=0 And tx < KolvoBlock And ty>=0 And ty<KolvoBlock Then
Text  GrX *0.5-100,GrY +KolvoBlock*tty+10 ,tx+" : "+ty
EndIf
Flip
Wend
End

Function DrawBackgraund()

End Function

Function Draw()
        Rect 5,5,790, GrY +KolvoBlock*tty+25,0
For y = 0 To KolvoBlock
        For x = 0 To KolvoBlock
                Plot GrX +MapCenterX(x,y),GrY +MapCenterY(x,y)
                Line GrX +MapX(x,0) , GrY , GrX +MapX(x,KolvoBlock) ,GrY +KolvoBlock*tty
                Line GrX +MapX(0,y) ,GrY +MapY(0,y) ,GrX +MapX(KolvoBlock,y) ,GrY +MapY(KolvoBlock,y)
        Next
Next
End Function


polopok 25.05.2014 17:32

Ответ: 2d сетка
 
Теперь значение перспективы можно задавать(менять) колесом мыши ,а так же некое подобие скролинга зажав ЛКМ.

Код:

time = CreateTimer(60)
Global  fov# = -10 ,GrX# = 330 , GrY# = 50,tx,ty
Const ttx = 40 , tty = 30 , KolvoBlock= 13
Dim MapX(KolvoBlock,KolvoBlock) ,  MapY(KolvoBlock,KolvoBlock) ,MapCenterX(KolvoBlock,KolvoBlock) ,  MapCenterY(KolvoBlock,KolvoBlock) ,map(KolvoBlock,KolvoBlock)

Graphics 800,600,32,2
SetBuffer BackBuffer()


;Origin 200,100
ClsColor 150,150,150
While Not KeyHit(1)
Cls
mx# = MouseX() : my# = MouseY()

fov = fov- MouseZSpeed() * 0.1
If MouseDown(1) Then
GrX = 800-mx
GrY = 250-my
FlushMouse()
EndIf
       
WaitTimer(time)       
        ty = Int(Floor( (my-GrY )/(tty+fov) ))
        tx = Int(Floor( ((mx-GrX ) / (ttx+(ty+fov)))) +5 );

For y = 0 To KolvoBlock
        For x = 0 To KolvoBlock
                px# =( x-5)*(ttx+(y+fov)) ;-5
                py# = y*(tty+fov)
                pcx# =(( x-5)*(ttx+(y+fov))) +(ttx/2+(y/2+fov/2))
                pcy# =y*(tty+fov)+(tty+fov)/2
               
                MapX(x,y) = px
                MapY(x,y) = py
               
                If y<KolvoBlock And x<KolvoBlock Then
                        MapCenterX(x,y) = pcx
                        MapCenterY(x,y) = pcy       
                EndIf       
        Next
Next
Draw()

;Line mx-100,0,mx-100,500
If tx>=0 And tx < KolvoBlock And ty>=0 And ty<KolvoBlock Then
Text  GrX *0.5-100,GrY +KolvoBlock*tty+10 ,tx+" : "+ty
EndIf       
Flip
Wend
FreeTimer timer
End

Function DrawBackgraund()

End Function

Function Draw()
        Rect 5,5,790, GrY +KolvoBlock*tty+25,0
For y = 0 To KolvoBlock
        For x = 0 To KolvoBlock
                Plot GrX +MapCenterX(x,y),GrY +MapCenterY(x,y)
                Line GrX +MapX(x,0) , GrY , GrX +MapX(x,KolvoBlock) ,GrY +KolvoBlock*(tty+fov)
                Line GrX +MapX(0,y) ,GrY +MapY(0,y) ,GrX +MapX(KolvoBlock,y) ,GrY +MapY(KolvoBlock,y)
        Next
Next
End Function


moka 25.05.2014 20:35

Ответ: 2d сетка
 
Вот бы такие прототипы в на JS писали, тогда код для блица (который не стоит тут у доброй половины форумчан) имел бы хоть какую-то пользу, т.к. можно было бы запустить в веб броузере демку сразу же, а не пропустить пост, т.к. это "блиц", а он уже мёртв.

polopok 25.05.2014 21:19

Ответ: 2d сетка
 
Думаю не стоит так переживать , тут главное формулы правильные вывести ,а там можно под любой язык или среду переписать.
Признаться пишу от безделия , а так хоть мозг не атрафируется и чтоб труды не пропали даром выкладываю сюда.

moka 25.05.2014 22:40

Ответ: 2d сетка
 
Цитата:

Сообщение от polopok (Сообщение 281446)
Думаю не стоит так переживать , тут главное формулы правильные вывести ,а там можно под любой язык или среду переписать.
Признаться пишу от безделия , а так хоть мозг не атрафируется и чтоб труды не пропали даром выкладываю сюда.

Дык тем более. JS на много ближе к любому другому языку, нежели блиц. JS знают на много больше людей, и у тебя напрямую будет в интернете что-то лежать, и гуглиться.
Труд твой тут в большинстве как раз и пропадает, те кому нужно - сами напишут, а те кто не может сам, будет искать на его языке что-то, или приблизительное. А на блице сейчас ничего не делают (про тех кто сидит в прошлом не говорю, "им не поможешь").
А вот польза от JS мелкой демки такого рода, где-то с заголовком и пару строками описания, гуглятся отлично и народу пригодится. Пользы больше, и тебе приятнее думаю было бы.

polopok 26.05.2014 00:04

Ответ: 2d сетка
 
Мдаа... Ты трав . А то зациклился на блице ))) , самому смешно .

polopok 26.05.2014 00:10

Ответ: 2d сетка
 
Вопрос писать на java или на javascript

St_AnGer 26.05.2014 00:13

Ответ: 2d сетка
 
Ну, предполагаю, что Максим имел ввиду именно JavaScript, а не на Java.

moka 26.05.2014 00:28

Ответ: 2d сетка
 
JavaScript.
Java требует компиляции и предустановленной всякой хрени. И вообще не имеет ничего общего с JavaScript'ом. :) Хотя у обоих С подобный скрипт и название схожее. Но на этом их сходства заканчиваются.

Плюс JS в том что он работает во ВСЕХ броузерах. Поддержка того же canvas 2d есть практически везде сейчас (даже в IE9 который уже старьё и поддерживать не стоит).
И можно просмотреть исходники сразу. И там же демки показывать - удобно очень.

Рекомендую начать с простого, вот ресурсы которые стоит использовать:
MDN - там документация по JavaScript'у одна из наилучших, так же они отлично описывают разные API и стандарты, с примерами и пометками "на все случаи жизни". Если что-то ищешь по JS в гугле, добавляй "mdn" и будет хорошая инфа.

HTML5 Canvas Tutorials - очень удобная и доступная документация по canvas 2d с примерами и детальной документацией. Примеры есть на всё. По сути там описан практически весь функционал canvas 2d.

CodePen - отличная тулза для прототипирования, и вообще можно там писать код, и сразу есть превью, и выкладывать это онлайн, другие могут также обновлять. "Доступно и приятно" :)

Да и новый язык изучить - всегда полезно, тем более такой как JS который имеет уйму применений, как в веб разработке, игр (canvas, webgl, да и iOS скоро будет поддерживать webgl - инфа 100%!), так и на стороне сервера - node.js.

polopok 26.05.2014 00:33

Ответ: 2d сетка
 
Кстати , пытаюсь 2д сетку в шарообразную сетку сделать , пока то ,что получилось.
если сталкивались с данной темой киньте ссылку .
Код:

time = CreateTimer(60)
Global x,y
Const tt = 18 ,r2 = 70
Dim mapX(324,324),mapY(324,324) ,mapR(324,324) ,mapG(324,324) ,mapB(324,324)

Graphics 800,600,32,2
SetBuffer BackBuffer()


For b=1 To tt ;Step 0.5
For a =1 To tt ;Step 0.5

        SphireView(a*20,b*20)
        mapX(a,b) = x
        mapY(a,b) = y
        mapR(a,b) = Rnd(225)
        mapG(a,b) = Rnd(225)
        mapB(a,b) = Rnd(225)
Next
Next
While Not KeyHit(1)
mx = MouseX()/20 :my = MouseY()/20
mxx =  r2*(Cos(mx*20)*Sin(my*20))
myy= r2*(Cos(my*20))  ;
Cls
WaitTimer(time)       
For b=1 To tt ;Step 0.5
For a = 1 To tt ;Step 0.5
Color mapR(a,b) , mapG(a,b) ,mapB(a,b)
Rect a*20,b*20,20,20,1
Rect mapX(a,b)+550-10,mapY(a,b)+200-10  , 20,20
;Plot mapX(a,b)+550,mapY(a,b)+200
Next
Next
Color 255,0,0
Rect mx*20,my*20,20,20,0
Rect mxx+550-10,myy+200-10,20,20,0
Color 255,255,255

Flip
Wend
FreeTimer timer
End

Function SphireView#(x1,y1)
x= r2*(Cos(x1)*Sin(y1))
y= r2*(Cos(y1))  ;(Sin(x1)-


End Function



javascript так javascript ... :-D

polopok 20.08.2015 20:25

Ответ: 2d сетка
 
После продолжительного затишья ...
код шарообразной сетки :-D .
(пока не кликабельно :) )
Код:

Graphics 800,600,32,2
SetBuffer BackBuffer()

num = 10


r#=242
n# = 4*num
a# = 4.0
r2=90

While Not KeyHit(1)
Cls
If KeyDown(200) r = r +1
If  KeyDown(208) r = r -1
If  KeyDown(203) a = a +.1
If a >= 0.1 And KeyDown(205) a = a -.1

For y = -num To num
For x = -num To num
        a1# = 180/(num*a)*x
        a2# = 180/(num*a)*y
                vx# = Cos(a1-r2)*Cos(a2)  ;*r
                vy# = Cos(a1)*Sin(a2)  ;*r
        Plot 400+ (x)+(vx)*r, 300+(y)+vy*r
        Text 400+ (x)+(vx)*r, 300+(y)+vy*r ,(x*y)
Next
Next

Text 20,20,"angle =  "+a+"  Radius =  "+r

Flip
Wend
End


polopok 20.08.2015 20:30

Ответ: 2d сетка
 
Ну и в нагрузку облако тегов :-D с определением по ближней полусфере.
Код:

time = CreateTimer(60)
Dim CosA#(3600)
Dim SinA#(3600)

For i# = 0 To 3600 Step 0.1
CosA(i)= Cos(i)
SinA(i)= Sin(i)
Next

Graphics 800,600,32,2
SetBuffer BackBuffer()

numpnt=200
radius =200

Dim x#(numpnt) ,y#(numpnt) ,z#(numpnt) ,name$(numpnt)

c# = 0 : a# = 0 : b# =0 : q#=1
p# = numpnt * Pi
        For n=1 To numpnt
                f#=ACos(-1+ (n* Pi) / numpnt*q)
                t# = Sqr(p)  *f
               
                x(n) = (radius * Sin(f) * Cos(t));
                y(n) = (radius * Sin(f) * Sin(t));
                z(n) = (radius * Cos(f));                               
                name(n) = "target_"+Str(n)               
        Next
While Not KeyHit(1)
Cls
mx# =MouseX() : my#= MouseY()       

WaitTimer(time)       
        For n=1To numpnt       
        sa#=Sin(a):ca#=Cos(a):sb#=Sin(b):cb#=Cos(b):sc#=Sin(c): cc#=Cos(c)

        xx# = x(n)*cb*cc - y(n)*cb*sc+ z(n)*sb;
        yy# = x(n)*(cc*sa*sb+ca*sc)+y(n)*(ca*cc-sa*sb*sc)- z(n)*(cb*sa);
        zz# =-x(n)*(ca*cc*sb+sa*sc)+y(n)*(cc*sa+ca*sb*sc)+ z(n)*(ca*cb);

        vv = Int(zz/3)

        Color 128+vv,128+vv,128+vv
        If RectsOverlap ((xx+400),(yy+300),StringWidth(name(n) ),StringHeight(name(n) )  ,(mx),(my),1,1) And zz>0
        Color 0,0,255
        Rect        400+ xx-4 , 300+ yy ,50,15 ,0
        EndIf
                Text 400+ xx , 300+ yy, name(n)
                       
               
       
        Next
       

        If b=360 b=0
        b=b+1
        c=b*0.1
Flip
Wend
FreeTimer(time)
End


moka 20.08.2015 21:13

Ответ: 2d сетка
 
А можно скрины? Думаю тут мало у кого блиц остался на компах..

Arton 20.08.2015 22:38

Ответ: 2d сетка
 

polopok 30.08.2015 08:16

Ответ: 2d сетка
 
Шарообразная сетка с выбором ячейки (при необходимости допилить :-D )
код:
Код:

;


Graphics 800,600,32,2
SetBuffer BackBuffer()

num = 10


r#=242
n# = 4*num
a# = 4.0
r2=90

While Not KeyHit(1)
Cls
mx# =MouseX() : my#= MouseY()       
If KeyDown(200) r = r +1
If  KeyDown(208) r = r -1
If  KeyDown(203) a = a +.1
If a >= 0.1 And KeyDown(205) a = a -.1

For y = -num To num
For x = -num To num
        a1# = 180/(num*a)*x
        a2# = 180/(num*a)*y
                vx# = Cos(a1-r2)*Cos(a2)  ;*r
                vy# = Cos(a1)*Sin(a2)  ;*r
                px# = 400+ (x)+(vx)*r
                py# = 300+(y)+vy*r
        Plot px, py
        Text px, py ,(x*y)
       
        If RectsOverlap ((px+2),(py),15,10  ,(mx),(my),1,1)
                Rect        px-4 , py ,20,10 ,0
        EndIf
Next
Next

Text 20,20,"angle =  "+a+"  Radius =  "+r

Flip
Wend
End


polopok 01.09.2015 15:47

Ответ: 2d сетка
 
использование безье кривых 3 порядка для создания сетки
( несколько коряво написан код :-D ) контрольные точки двигать мышью ... автовыбор точки по наведению , а потом кликать , кликать и кликать . . . :4to:
сам код :

Код:

Const n = 7
time = CreateTimer(60)

Global px#[7],py#[7]

Graphics 800,600,32,2
SetBuffer BackBuffer()
px[0] = 100 : py[0] = 100
px[1 ]= 100 : py[1] = 50
px[2] = 200 : py[2] = 50
px[3 ]= 200 : py[3] = 100

px[4] = 300 : py[4] = 300
px[5 ]= 100 : py[5] = 150
px[6 ]= 400 : py[6] = 150
px[7 ]= 400 : py[7] = 300

b# = 1.0/300
b2# = 1.0/300

While Not KeyHit(1)
Cls
mx = MouseX() : my=MouseY()
WaitTimer(time)
Color 255,5,5
For p = 0 To 7

If Dist(px[p] ,py[p],mx,my)<15
        Rect px[p]- 4,py[p]-4,8,8,0
        ppp= p
EndIf
        If MouseDown(1)
        px[ppp] = mx
        py[ppp] = my
        Oval mx-10,my-10, 20,20,0
        EndIf

Next
t# = b

buff = BackBuffer()
LockBuffer buff
While t <1.01
        t2# = b2
        qx1#= Bezie3Q( Px[0],Px[1],Px[2] ,Px[3],t)
        qy1#=Bezie3Q (Py[0],Py[1],Py[2] ,Py[3],t)               

        While t2 <1.01
        qx2#= Bezie3Q( Px[4],Px[5],Px[6] ,Px[7],t)
        qy2#=Bezie3Q (Py[4],Py[5],Py[6] ,Py[7],t)
       
        x# = BezeQ(qx1,qx2,t2 )
        y# = BezeQ(qy1,qy2,t2 )
               
        WritePixel x+1,y,$333333 ,buff
        WritePixel x,y,$cccccc ,buff
        WritePixel x,y+1,$ccccff,buff
       
        WritePixel qx2,qy2,$ff0000,buff
        WritePixel qx1,qy1,$ff0000,buff
        t2 = t2 + b2
        Wend
       
        t = t + b
Wend
UnlockBuffer buff
For p = 0 To 7
        Rect  px[p]- 2,py[p]-2,4,4,1
Next
Color  128,228,228
Line px[0] ,py[0] ,px[1 ],py[1 ]
Line px[3] ,py[3] ,px[2] ,py[2]
Line px[4] ,py[4] ,px[5] ,py[5 ]
Line px[6] ,py[6] ,px[7] ,py[7 ]

Text 20,20,"Point selct N -  "+ppp
Flip
Wend
FreeTimer time
End



Function Dist#( X1#, Y1#, X2#, Y2# )
        Return (( (X1 - X2)*(X1 - X2) + (Y1 - Y2)*(Y1 - Y2) )^0.5)
End Function

Function Bezie3Q#(P0#,P1#,P2#,P3#,Tt# )
        Return ( (1.0-Tt)^3*P0 + 3*(1.0-Tt)^2*Tt*P1 +3*(1.0-Tt)*Tt^2*P2 + Tt^3*P3 )
End Function

Function BezeQ#(pp0#,pp1#,tt# ) ; pp0 -> x or y or z ... | pp1  -> x,y,z ... next or end point
        Return ( (1.0-tt)*pp0+tt*pp1)
End Function


moka 01.09.2015 16:29

Ответ: 2d сетка
 
Вот бы эти демки на js'е писал, в codepen (например).
И в нете выкладывал, на twitter'е (например).

Их бы запустили не 2-3 человека, а сотни или тысячи, полюбовались, и кто-то чему-то научился бы.

polopok 01.09.2015 16:46

Ответ: 2d сетка
 
:crazy: каюсь до JS руки не доходят ,а тут на блице привычнее

St_AnGer 01.09.2015 16:59

Ответ: 2d сетка
 
Цитата:

Сообщение от polopok (Сообщение 299191)
:crazy: каюсь до JS руки не доходят ,а тут на блице привычнее

Но ведь мало кто может посмотреть результат работы твоих алгоритмов... Блиц то мало у кого остался скорее всего (даже у меня он где то далеко далеко в глубинах старого винта валяется, и, запустить его нету возможностей). Остаётся только рисовать в голове работу алгоритма. Прикладывай хотя бы скриншоты, а лучше всё таки переходи на распространённые нынче вещи :)

moka 01.09.2015 17:07

Ответ: 2d сетка
 
Цитата:

Сообщение от St_AnGer (Сообщение 299192)
Прикладывай хотя бы скриншоты, а лучше всё таки переходи на распространённые нынче вещи :)

Распространенные и доступные (JS! ;))

polopok 06.09.2015 15:49

Ответ: 2d сетка
 
Собственно с чего начался пост ... сетка вида ... ну типа перспектива

псевдо 3д


ОСоБЕННОСТИ :
регулируемый наклон ;
произвольное количество тайлов (в пределах раумного конечно :crazy: );
регулируемая высота и ширина тайла . . .
код прилагаю под спойлером:
Код:

Global mz#,grx ,gry

Graphics 800,600 ,32,2
SetBuffer BackBuffer()
grx = GraphicsWidth()/2 : gry = GraphicsHeight()/2
tile_sizeX = 50
tile_sizeY = 20
a = 5
b = a+a+1
ClsColor 34 ,139 ,34 
While Not KeyHit(1)
Cls
mx# = MouseX() : my# = MouseY() : mz# = MouseZ()*0.1+1

For y = 1 To b
        For x = -a To a
                px# = x*tile_sizeX +(y*mz)*x
                py# =  y*tile_sizeY
               
                Color 3 ,35, 3
                If x<a Line grx + px,py +gry , grx +  ( (x+1)*tile_sizeX )+((y*mz)*(x+1)),py+gry
                If y<b  Line grx + px,py+gry , grx +  ( x*tile_sizeX )+((y+1)*mz*x) ,(y+1)*tile_sizeY+gry
               
                If y<b And  x<a Text grx +px+20 ,py+2+gry , (x+a+1)+" : "+y
        Next
Next
; номера тайла по Х и Y координатам мыши
        ym# = Floor#((my-gry) / tile_sizeY )
        xx# = Floor#(  (( mx-grx )  /  (((my-gry) / tile_sizeY )*mz+tile_sizeX)  )  )

                Text mx,my-10,Int(xx+a+1) +" : "+Int(ym)

                Text 20,20,"MouseX : "+Int(mx)+" MouseY : "+Int(my)+" MouseZ : "+mz
                Text 20,40,"X : "+Int(xx+a+1)
                Text 20,60,"Y : "+Int(ym)
               
                DrawSelectTile(xx,ym,tile_sizeX,tile_sizeY)
Flip
Wend
End

Function DrawSelectTile#(ntx,nty,tileSizeX,tileSizeY )
        Color 255,255,255
        tx# = ntx*tileSizeX +(nty*mz)*ntx                            : ty# = nty*tileSizeY : ty2# = (nty+1)*tileSizeY

        tx2# = ((ntx+1)*tileSizeX +((nty+1)*mz)*(ntx+1) )
        px# = (tx+tx2)/2
        py# = (ty+ty2)/2

        Oval  grx +px -4,gry + py -4,8,8
        ;Line grx +tx ,gry + ty ,grx +tx2 ,gry + ty2
End Function


polopok 25.04.2016 07:54

Ответ: 2d сетка
 
Возвращаясь к теме.
А теперь внимание, )) правильные формулы :

; вычисление координат ячейки
; tileNumberY , tileNumberX --> количество ячеек по вертикали и горизонтали
; tileSizeY , tileSizeX --> размер ячеек по вертикали и горизонтали
; tileSpaceY , tileSpaceX --> смещение ячеек по вертикали и горизонтали
; tileView --> параметр задающий искажение по горизонтали ("перспектива")


for j = 0 to tileNumberY
for i = 0 to tileNumberX

x = i * tileSizeX + j * (i * tileView) + tileSpaceX
y = j * tileSizeY + tileSpaceY

next:next

; вычисление номеров ячейки по координатам мыши

ym = floor((mouseY() - tileSpaceY) / tileSizeY);
xm = floor((mouseX() - tileSpaceX) / tileView / (((mouseY() - thisY - tileSpaceY) / tileSizeY) + (tileSizeX/tileView ))) + tileNumberX;

denis2000513 06.01.2018 14:17

Ответ: 2d сетка
 
---:SOS:

L-ee-X 06.01.2018 22:09

Ответ: 2d сетка
 
Цитата:

Сообщение от denis2000513 (Сообщение 314565)
---:SOS:

Че надо то?


Часовой пояс GMT +4, время: 04:39.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot