약한 간단한 다각형 (즉, 양쪽면은 교차 할 수 있지만 교차하지는 않는 다각형)을 감지하는 알고리즘을 찾을 수 없습니다. 현재 모든면 사이의 교차점을 확인 중입니다. 여기에 인접하지 않은면을 모두 호출하는 함수가 있습니다. 이 방법은 단순한 다각형 만 허용됩니다 (전혀 접촉하지 않음). 다각형은 점의 벡터입니다. 간단 일부 복잡한 다각형을 허용하기 때문에 작동하지 않습니다 s < 1. && s > 0. && t < 1. && t > 0.
를 사용다각형이 약한 지 테스트하기
bool linesIntersect(const point &a1, const point &a2, const point &b1, const point &b2) {
// Solve intersection of parametric lines using inverse matrix
// The equation of the parametric lines are line1 = (a2 - a1)*s + a1
// and line2 = (b2 - b1)*t + b1, where a1, a2, etc. are vectors.
// Two equations can be produced from the two components, and these
// this system of two equations can be solved for s and t
// If the parameters s and t are between 0 and 1, it means that the lines intersect
float x21 = a2.x - a1.x, x43 = b2.x - b1.x, x31 = b1.x - a1.x,
y21 = a2.y - a1.y, y43 = b2.y - b1.y, y31 = b1.y - a1.y;
float determinant = x43*y21 - x21*y43;
if(determinant == 0.) return false;
float s = float(x43*y31 - x31*y43)/determinant;
float t = float(x21*y31 - x31*y21)/determinant;
if(s <= 1. && s >= 0. && t <= 1. && t >= 0.) return true; // lines intersect
return false;
}
.
this question의 첫 번째 그림은 몇 가지 예를 보여줍니다. 아래는 프로그램이 다루는 전형적인 약한 폴리곤입니다.
나는 상기 질문 (1)에서 수학 용어부터 의사 나 무서워하고 나는 복잡한 알고리즘을 구현하는 지식을 가지고 생각하지 않습니다를 선호하는 것입니다. 나는 Boost.Polygon을 사용하고 있는데 거기에 뭔가가 있다면 뭔가를 찾지 못했습니다.
편집 :
다음은이 기능의 사용 방법입니다. checkPts는 vector<point>
이며 마지막 점에서 첫 번째 점까지 가정합니다.
// Check for self-intersecting polygons
for(int i = 0; i < checkPts.size() - 2; ++i) {
for(int j = i + 2; j < checkPts.size() - 2; ++j) {
if(linesIntersect(checkPts[i], checkPts[i+1], checkPts[j], checkPts[j+1])) error("self-intersecting polygon");
}
}
다음은 측면 교차 여부를 확인할 수있는 계산법입니다 : http://stackoverflow.com/a/7069702/3516541. – Ben
그것이 본질적으로 당신이하고있는 일인지 확신 할 수 없습니다. 귀하의 표기법은 약간 헷갈 렸습니다. – Ben
당신의 질문은 부동 소수점 숫자의 평등을 비교하는 것에 귀착됩니다. 당신이하려고하는 것이 실제로 가치가 있는지 확신합니까? – Beta