# Very strange LD poligon behavior! • ### Question

• I was messing around with LDshapes.addpolygon when I ran into a very weird problem.

When I add a polygon like this, It works:

```points["X"] = 0
points["X"] = 50

points["X"] = 75 '< -- num 3
points["X"] = 50 '< -- num 2

points["X"] = 0
points["X"] = -25
points["Y"] = 0
points["Y"] = 0
points["Y"] = 50
points["Y"] = 25
points["Y"] = 50
points["Y"] = 25

Shapes.Move(polygon,100,100```

Notice that

`points["X"]`

is before

`points["X"]`

this works well unless I put them in order. like so:

```points["X"] = 0
points["X"] = 50

points["X"] = 50 '< -- num 2
points["X"] = 75 '< -- num 3

points["X"] = 0
points["X"] = -25
points["Y"] = 0
points["Y"] = 0
points["Y"] = 50
points["Y"] = 25
points["Y"] = 50
points["Y"] = 25

Shapes.Move(polygon,100,100)```

Here is a picture of the difference:

3 before 2: 2 before 3: Thanks!!

It is written: "'As surely as I live,' says the Lord, 'every knee will bow before me; every tongue will acknowledge God.'" Romans 14:11

Monday, May 6, 2013 11:21 PM

• Interesting!  This means that values of indices are not used as order for vertices of polygon.  Definition order is used as order for vertices of polygon.  Thanks. Nonki Takahashi

• Marked as answer by Tuesday, May 7, 2013 4:51 PM
Tuesday, May 7, 2013 1:40 AM

### All replies

• Interesting!  This means that values of indices are not used as order for vertices of polygon.  Definition order is used as order for vertices of polygon.  Thanks. Nonki Takahashi

• Marked as answer by Tuesday, May 7, 2013 4:51 PM
Tuesday, May 7, 2013 1:40 AM
• Wow! Neat!

So I can switch them in a For loop and it doesn't matter.

```For i = 1 To 10
Points[i]["X"] = (i * 10)
Points[i]["Y"] = 0
EndFor

For i = 11 To 20
Points[i]["X"] = 100
Points[i]["Y"] = (i - 10) * 10
EndFor

--^-- This works as well as this --v--

```For i = 11 To 20
Points[i]["X"] = 100
Points[i]["Y"] = (i - 10) * 10
EndFor

For i = 1 To 10
Points[i]["X"] = (i * 10)
Points[i]["Y"] = 0
EndFor

It is written: "'As surely as I live,' says the Lord, 'every knee will bow before me; every tongue will acknowledge God.'" Romans 14:11

Tuesday, May 7, 2013 4:51 PM
• The reason is that the indices in SmallBasic are not assumed to be integers and so Points["X"] isn't necessarily the first point, the user could have indexed from 0 i.e. Points["X"] or in fact any other way, even Points["A"].  The second index also behaves the same, so the X value for each point should be defined first.  This could cause problems or at least severe confusion!

What it does is equivalent to Array.GetAllIndices so it is the order they are created that counts.

Well done for spotting and Nonki for correctly diagnosing.

• Edited by Tuesday, May 7, 2013 6:34 PM
Tuesday, May 7, 2013 6:12 PM
• So I made a gear here, but it won't work in the physics extension (It adds it but it won't move). any idea why?

```Points2 = "1=X\=109\;Y\=0\;;2=X\=116\;Y\=24\;;3=X\=132\;Y\=30\;;4=X\=152\;Y\=15\;;5=X\=168\;Y\=25\;;6=X\=168\;Y\=25\;;7=X\=159\;Y\=50\;;8=X\=169\;Y\=63\;;9=X\=193\;Y\=62\;;10=X\=200\;Y\=77\;;11=X\=178\;Y\=94\;;12=X\=178\;Y\=106\;;13=X\=197\;Y\=120\;;14=X\=194\;Y\=137\;;15=X\=168\;Y\=138\;;16=X\=159\;Y\=152\;;17=X\=167\;Y\=175\;;18=X\=152\;Y\=185\;;19=X\=132\;Y\=171\;;20=X\=116\;Y\=175\;;21=X\=108\;Y\=198\;;22=X\=90\;Y\=199\;;23=X\=82\;Y\=176\;;24=X\=68\;Y\=170\;;25=X\=47\;Y\=184\;;26=X\=33\;Y\=174\;;27=X\=40\;Y\=151\;;28=X\=32\;Y\=139\;;29=X\=7\;Y\=138\;;30=X\=0\;Y\=121\;;31=X\=21\;Y\=108\;;32=X\=22\;Y\=93\;;33=X\=1\;Y\=78\;;34=X\=6\;Y\=61\;;35=X\=30\;Y\=62\;;36=X\=40\;Y\=50\;;37=X\=33\;Y\=25\;;38=X\=48\;Y\=15\;;39=X\=65\;Y\=28\;;40=X\=83\;Y\=25\;;41=X\=91\;Y\=1\;;42=X\=108\;Y\=2\;;"
For i = 1 To 42
Points[i]["X"] = Points2[i]["X"] / 3
Points[i]["Y"] = Points2[i]["Y"] / 3
EndForFor i = 1 To 10  polygon = LDShapes.AddPolygon(points)  LDPhysics.AddMovingShape(polygon,0.5,0.8,1)  LDPhysics.SetPosition(polygon,60*i,100,0)  LDPhysics.SetTorque(polygon,100*LDPhysics.GetInertia(polygon))EndForWhile ("True")  LDPhysics.DoTimestep()  Program.Delay(20)EndWhile```

--^-- this doesn't work,

```points["X"] = 0
points["Y"] = 0
points["X"] = 40
points["Y"] = 0
points["X"] = 60
points["Y"] = 40
points["X"] = 40
points["Y"] = 80
points["X"] = 0
points["Y"] = 20

For i = 1 To 10
LDPhysics.SetPosition(polygon,60*i,100,0)
LDPhysics.SetTorque(polygon,100*LDPhysics.GetInertia(polygon))
EndFor

While ("True")
LDPhysics.DoTimestep()
Program.Delay(20)
EndWhile```

--^-- this does.

It is written: "'As surely as I live,' says the Lord, 'every knee will bow before me; every tongue will acknowledge God.'" Romans 14:11

Tuesday, May 7, 2013 7:23 PM
• 2 Points;

1] It turns out there is an internal limit on the number of vertices on a primitive shape in Box2D - this is 8.  Probably for a good reason.

2] The primitive shapes should also be convex.

My guess is the best approach is to create and group several primitive shapes into one compound shape using LDPhysics.GroupShapes.

Tuesday, May 7, 2013 8:02 PM
• If you are still looking at this I had to make a change to handle polygons when they are not created at the origin (0,0).  A modified version of the extension is uploaded and here is a simple cog test, import QJR853. 