Ich habe einen Code, der es dem Benutzer ermöglicht, eine Form zu zeichnen. Dafür verwende ich UIBezierPath. Aber ich muss überprüfen, ob die Form sich selbst schneidet, zum Beispiel wie hier: http://upload.wikimedia.org/wikipedia/commons/0/0f/Complex_polygon.svg Dann handelt es sich nicht um eine gültige Form. Wie kann ich das herausfinden?
Bearbeiten: Ich habe das immer noch nicht gelöst. Ich speichere alle Punkte zwischen den Linien im Pfad in einem Array. Dann durchlaufe ich das Array und versuche festzustellen, ob sich Linien kreuzen. Aber das funktioniert nicht, manchmal wird angezeigt, dass es einen Schnittpunkt gibt, obwohl keiner vorhanden ist.
Ich denke, dass das Problem irgendwo in dieser Methode liegt.
-(BOOL)pathIntersects:(double *)x:(double *)y {
int count = pathPoints.count;
CGPoint p1, p2, p3, p4;
for (int a=0; a
`Dies ist der Code, den ich gefunden habe, um festzustellen, ob sich zwei Linien schneiden. Er ist in C, aber er sollte funktionieren.
int LineIntersect(
double x1, double y1,
double x2, double y2,
double x3, double y3,
double x4, double y4,
double *x, double *y)
{
double mua,mub;
double denom,numera,numerb;
denom = (y4-y3) * (x2-x1) - (x4-x3) * (y2-y1);
numera = (x4-x3) * (y1-y3) - (y4-y3) * (x1-x3);
numerb = (x2-x1) * (y1-y3) - (y2-y1) * (x1-x3);
/* Sind die Linien koinzident? */
if (ABS(numera) < 0.00001 && ABS(numerb) < 0.00001 && ABS(denom) < 0.00001) {
*x = (x1 + x2) / 2;
*y = (y1 + y2) / 2;
return(TRUE);
}
/* Sind die Linien parallel */
if (ABS(denom) < 0.00001) {
*x = 0;
*y = 0;
return(FALSE);
}
/* Liegt der Schnittpunkt entlang der Segmente */
mua = numera / denom;
mub = numerb / denom;
if (mua < 0 || mua > 1 || mub < 0 || mub > 1) {
*x = 0;
*y = 0;
return(FALSE);
}
*x = x1 + mua * (x2 - x1);
*y = y1 + mua * (y2 - y1);
return(TRUE);
}`