194 return { |
196 return { |
195 glm::vec2{rectangle.right(), rectangle.top()}, |
197 glm::vec2{rectangle.right(), rectangle.top()}, |
196 glm::vec2{rectangle.right(), rectangle.bottom()} |
198 glm::vec2{rectangle.right(), rectangle.bottom()} |
197 }; |
199 }; |
198 } |
200 } |
|
201 |
|
202 bool geom::convex(const std::vector<glm::vec3>& polygon) |
|
203 { |
|
204 const int n = polygon.size(); |
|
205 auto polygonRing = iter::ring(polygon, n); |
|
206 std::vector<glm::vec3> crosses; |
|
207 crosses.resize(n); |
|
208 for (int i = 0; i < n; i += 1) |
|
209 { |
|
210 crosses[i] = glm::cross(polygonRing[i - 1] - polygonRing[i], polygonRing[i + 1] - polygonRing[i]); |
|
211 } |
|
212 for (int i = 0; i < n - 1; i += 1) |
|
213 { |
|
214 const float dotp = glm::dot(crosses[0], crosses[i + 1]); |
|
215 if (dotp < 0 or qFuzzyIsNull(dotp)) |
|
216 { |
|
217 return false; |
|
218 } |
|
219 } |
|
220 return true; |
|
221 } |