| 113 | } |
| 114 | |
| 115 | func TestSpaceComponent_Overlaps(t *testing.T) { |
| 116 | tol := engo.Point{X: 1e-5, Y: 1e-5} |
| 117 | scs := []SpaceComponent{} |
| 118 | space0 := SpaceComponent{Width: 5, Height: 5, Position: engo.Point{X: 0, Y: 0}} //AABB |
| 119 | space1 := SpaceComponent{Width: 5, Height: 5, Position: engo.Point{X: 10, Y: 0}} //Triangle |
| 120 | space1.AddShape(Shape{Lines: []engo.Line{ |
| 121 | {P1: engo.Point{X: 0, Y: 0}, P2: engo.Point{X: 0, Y: 5}}, |
| 122 | {P1: engo.Point{X: 0, Y: 5}, P2: engo.Point{X: 5, Y: 5}}, |
| 123 | {P1: engo.Point{X: 5, Y: 5}, P2: engo.Point{X: 0, Y: 0}}, |
| 124 | }}) |
| 125 | space2 := SpaceComponent{Width: 5, Height: 5, Position: engo.Point{X: 0, Y: 10}} //Multi-Shape |
| 126 | space2.AddShape(Shape{Lines: []engo.Line{ |
| 127 | {P1: engo.Point{X: 2.5, Y: 0}, P2: engo.Point{X: 2.5 + 0.57735026919, Y: 1}}, |
| 128 | {P1: engo.Point{X: 2.5 + 0.57735026919, Y: 1}, P2: engo.Point{X: 2.5 - 0.57735026919, Y: 1}}, |
| 129 | {P1: engo.Point{X: 2.5 - 0.57735026919, Y: 1}, P2: engo.Point{X: 2.5, Y: 0}}, |
| 130 | }}) |
| 131 | space2.AddShape(Shape{Lines: []engo.Line{ |
| 132 | {P1: engo.Point{X: 0, Y: 2.5}, P2: engo.Point{X: 1, Y: 2.5 + 0.57735026919}}, |
| 133 | {P1: engo.Point{X: 1, Y: 2.5 + 0.57735026919}, P2: engo.Point{X: 1, Y: 2.5 - 0.57735026919}}, |
| 134 | {P1: engo.Point{X: 1, Y: 2.5 - 0.57735026919}, P2: engo.Point{X: 0, Y: 2.5}}, |
| 135 | }}) |
| 136 | space2.AddShape(Shape{Lines: []engo.Line{ |
| 137 | {P1: engo.Point{X: 5, Y: 2.5}, P2: engo.Point{X: 4, Y: 2.5 + 0.57735026919}}, |
| 138 | {P1: engo.Point{X: 4, Y: 2.5 + 0.57735026919}, P2: engo.Point{X: 4, Y: 2.5 - 0.57735026919}}, |
| 139 | {P1: engo.Point{X: 4, Y: 2.5 - 0.57735026919}, P2: engo.Point{X: 5, Y: 2.5}}, |
| 140 | }}) |
| 141 | space2.AddShape(Shape{Lines: []engo.Line{ |
| 142 | {P1: engo.Point{X: 0, Y: 5}, P2: engo.Point{X: 1.15470053838, Y: 5}}, |
| 143 | {P1: engo.Point{X: 1.15470053838, Y: 5}, P2: engo.Point{X: 0.57735026919, Y: 4}}, |
| 144 | {P1: engo.Point{X: 0.57735026919, Y: 4}, P2: engo.Point{X: 0, Y: 5}}, |
| 145 | }}) |
| 146 | space2.AddShape(Shape{Lines: []engo.Line{ |
| 147 | {P1: engo.Point{X: 5, Y: 5}, P2: engo.Point{X: 5 - 1.15470053838, Y: 5}}, |
| 148 | {P1: engo.Point{X: 5 - 1.15470053838, Y: 5}, P2: engo.Point{X: 5 - 0.57735026919, Y: 5}}, |
| 149 | {P1: engo.Point{X: 5 - 0.57735026919, Y: 5}, P2: engo.Point{X: 5, Y: 5}}, |
| 150 | }}) |
| 151 | space3 := SpaceComponent{Width: 5, Height: 5, Position: engo.Point{X: 10, Y: 10}} //Circle |
| 152 | space3.AddShape(Shape{Ellipse: Ellipse{Rx: 2.5, Cx: 2.5, Ry: 2.5, Cy: 2.5}}) |
| 153 | space4 := SpaceComponent{Width: 5, Height: 5, Position: engo.Point{X: 20, Y: 0}} //Ellipse |
| 154 | space4.AddShape(Shape{Ellipse: Ellipse{Rx: 2.5, Cx: 2.5, Ry: 5, Cy: 2.5}}) |
| 155 | space5 := SpaceComponent{Width: 5, Height: 5, Position: engo.Point{X: 0, Y: 20}, Rotation: 30} //Ellipse-Rotated |
| 156 | space5.AddShape(Shape{Ellipse: Ellipse{Rx: 2.5, Cx: 2.5, Ry: 5, Cy: 2.5}}) |
| 157 | scs = append(scs, space0, space1, space2, space3, space4, space5) |
| 158 | |
| 159 | //nothing overlaps at first |
| 160 | for i := 1; i < len(scs); i++ { |
| 161 | if o, _ := scs[i].Overlaps(scs[0], tol, tol); o { |
| 162 | t.Errorf("Overlap detected when none of the scs should overlap. Was on Space Component %v", i) |
| 163 | } |
| 164 | } |
| 165 | |
| 166 | for i := 1; i < len(scs); i++ { |
| 167 | scs[0].Position = scs[i].Position |
| 168 | if o, _ := scs[0].Overlaps(scs[i], tol, tol); !o { |
| 169 | t.Errorf("SpaceComponents 0 and %v did not overlap but should have", i) |
| 170 | } |
| 171 | } |
| 172 | |