Comment puis-je déplacer une balle le long d'un uibezierpath spécifique? Est-ce que cela est possible?
J'ai tout essayé, y compris faire un test de frappe à l'aide de p> Comment puis-je détecter une touche sur un chemin? p> p>
5 Réponses :
C'est un problème vraiment difficile. Vous devrez déterminer le point sur le chemin le plus proche du point touché, qui est un problème de mathématiques compliqué. C'est la meilleure chose que je puisse trouver en utilisant une recherche rapide Google. (Méfiez-vous: le code est en basique.) P>
http://www.tinaja.com/glib/bezdist.pdf < / p>
J'admets, je suis tenté de l'écrire moi-même. Ce serait très utile et j'aime un défi. P>
Cory! C'est beaucoup plus facile que celui sur un Mac. Vous utilisez simplement CGContextPathContainspoint. Après cela, il s'agit de trois lignes de code pour itération et trouvez où elle touchait.
J'avais supposé qu'il voulait placer la balle sur le chemin le plus proche de l'endroit où le doigt était. Peut-être que je me suis trompé.
Premièrement ... c'est un fait absolu que:
Il y a, définitivement, pas de méthode, fournie par Apple, C'est un fait absolu de février 2011, dans le dernier système d'exploitation et tout juste à l'horizon. J'ai parlé aux ingénieurs concernés à Apple sur la question. C'est ennuyeux dans de nombreux contextes de programmation de jeu, mais c'est le fait. Donc, cela pourrait être que cela répond à votre question? P> Deuxièmement: N'oubliez pas que c'est aussi facile que la tarte d'animer quelque chose Troisièmement: En ce qui concerne la découverte de l'endroit où la touche s'est produite, si c'est ce que vous demandez, comme le dit Cory, c'est un problème difficile! Mais vous pouvez utiliser cgcontextpathContainspoint strong> pour savoir si un point (ou un toucher) était sur em> strong> un chemin d'une épaisseur donnée. P> < P> Après cela, en supposant que nous parlons de Cubics, vous devez trouver des points et des vitesses probables (aka tangentes) le long d'un bézier. p> voici le code total, total pour faire Que: em> strong> Trouvez la tangente d'un point sur une courbe cubique de Bézier (sur un iPhone) . Je l'ai collé ci-dessous aussi. P> Vous devrez mettre en œuvre votre propre MCSIM ou son propre itération pour trouver où il frappe, en fonction de votre situation. Ce n'est pas si difficile. P> (quatrièmement - comme une note de bas de page, il y a cette nouvelle chose où vous pouvez tracer progressivement un bezpath, probablement pas pertinent pour votre question, mais juste une note.) P> Pour la commodité de toute personne qui lit à l'avenir, voici le résumé de la question liée des deux routines "pratiques" ... p> enfin, ici de la mode la plus simple possible sont les deux routines pour calculer des points équidistants (en fait, approximativement équidistant) et les tangentes de ceux-ci, le long d'un bézier cubique: em> p> les quatre Les valeurs préalculées, C1 C2 C3 C4, sont parfois appelées coefficients du Bézier. (Rappelez-vous que les B C D sont généralement appelés les quatre points de contrôle.) Bien sûr, T fonctionne de 0 à 1, peut-être par exemple chaque 0,05. Appelez simplement ces routines une fois pour x et séparément une fois pour y strong>.
J'espère que cela aide quelqu'un em>! P> p>
Pour extraire des points d'un uibezierPath em> fort>. P>
Lorsque des touches sont arrivées sur le chemin est un problème. Mais si nous connaissons chaque point sur Chemin, il est possible de poser le point sur le chemin et d'utiliser derrière une animation invisible pour commencer à déplacer le point de déplacement.
Bonne réponse. Vos maths sont plus simples que ce que j'ai trouvé.
Ne peut pas cgpathApply code> être utilisé pour extraire les points d'un uibezierpath? Par exemple:
CGPATHApply ([MyBezierPath CGPath], MyPointArray, MyElmentProcessorFunction) Code>.
@EFC HI EFC. Non, cgpathApply n'est totalement pas liée. CGPathApply vous donne les différents "éléments" qui constituent le concept de chemin (en d'autres termes, vos "instructions" telles que: Commencez ici, dessinez une ligne droite à ici, dessinez un quadratique à tel et tort, dessinez un cercle ici). Il n'a rien du tout à faire avec extraire les points le long du résultat créé mathématiquement. Malheureusement!
mathématiquement, vous ne pouvez pas déterminer si un point à l'intérieur d'une courbe, un pure mathématique, comme une courbe n'a pas de surface. Ce que vous pouvez faire, c'est le test si le point est à l'intérieur de la surface définie par les limites de la courbe fermée créée par Si Si cgpathCreatecopyBystrokingPath code> avec
cgpathContainSpoint code>. Il crée la courbe qui est remplie pour rendre votre courbe à l'écran. p>
CGPathCreatecopyBystrokingPath code> est appelé avec son paramètre:
CGFLOAT LineWidth Code> Moins ou égal au rayon minimum de courbe de la courbe d'origine, il ne se croiscera pas. De plus, la courbe d'origine ne doit pas se croiser. P>
cgpathContainSpoint code> renvoie true, et les deux conditions que j'ai mentionnées sont remplies, vous êtes assuré de trouver un seul point sur la courbe qui se trouve à distance de
LineWidth code>. Il n'y a pas de solution algébrique à cela, vous devez donc trouver un point approximatif sur la courbe proche du point touché avec la méthode décrite ici: Trouvez un point, une distance donnée, le long d'une simple courbe cubique bézier. (Sur un iPhone!) p>
Il existe une méthode de la classe de BezierPath appelée ContexPoint: "> http://developer.apple.com/library/ios/#documentation/2ddrawing/conceptual/drawingprintingios/bezierpaths/bezierpaths.html
Et vous pouvez détecter la météo Le point tactile est à l'objet de chemin de la Bézier ou pas. J'en ai utilisé cela avec ma propre méthode par laquelle un utilisateur peut facilement détecter une touche sur le chemin Bézier (pas à l'intérieur ou à l'intérieur ou de sied si un cercle ou un chemin de fermeture est là). p>
Ce code permet à l'utilisateur de sélectionner un objet de dessin du chemin Bezier sur le toucher et une ligne pointillée avec animation apparaît dessus. J'espère que cela aide quelqu'un. Voici le code de mon propre projet: P>
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if([[self tapTargetForPath:path] containsPoint:startPoint]) // 'path' is bezier path object { [self selectShape:currentSelectedPath];// now select a new/same shape NSLog(@"selectedShapeIndex: %d", selectedShapeIndex); break; } } // this method will let you easily select a bezier path ( 15 px up and down of a path drawing) - (UIBezierPath *)tapTargetForPath:(UIBezierPath *)path { if (path == nil) { return nil; } CGPathRef tapTargetPath = CGPathCreateCopyByStrokingPath(path.CGPath, NULL, fmaxf(35.0f, path.lineWidth), path.lineCapStyle, path.lineJoinStyle, path.miterLimit); if (tapTargetPath == NULL) { return nil; } UIBezierPath *tapTarget = [UIBezierPath bezierPathWithCGPath:tapTargetPath]; CGPathRelease(tapTargetPath); return tapTarget; } -(void)selectShape:(UIBezierPath *)pathToSelect { centerline = [CAShapeLayer layer]; centerline.path = pathToSelect.CGPath; centerline.strokeColor = [UIColor whiteColor].CGColor; centerline.fillColor = [UIColor clearColor].CGColor; centerline.lineWidth = 1.0; centerline.lineDashPattern = [NSArray arrayWithObjects:[NSNumber numberWithInt:10], [NSNumber numberWithInt:5], nil]; [self.layer addSublayer:centerline]; // showing animation on line CABasicAnimation *dashAnimation; dashAnimation = [CABasicAnimation animationWithKeyPath:@"lineDashPhase"]; [dashAnimation setFromValue:[NSNumber numberWithFloat:0.0f]]; [dashAnimation setToValue:[NSNumber numberWithFloat:30.0f]]; [dashAnimation setDuration:1.0f]; [dashAnimation setRepeatCount:10000]; [centerline addAnimation:dashAnimation forKey:@"linePhase"]; }
À Bezier Chemier ne signifie pas sur le chemin Bezier, il détecte de faux positifs lorsque vous touchez à l'intérieur de la courbe de Bézier loin de la ligne circonférentielle
du code ci-dessus, il détectera une touche correcte sur la ligne circonférentielle
Un bezierPath est une classe qui ne tire que des choses. Cela ne sera pas en mesure de répondre à aucun événement.
Vrai, mais CGContextPathContainSpoint est un incroyable morceau d'ingénierie, Antwan. C'est là pour vous sur n'importe quel chemin BEZ!
Toute chance? Avez-vous eu une solution pour cela?
(1) C'est un fait absolu que: Malheureusement, il n'y a certainement aucune méthode (fournie par Apple) pour extraire des points d'un UibezierPath. Pour estimer, utilisez ceci: Stackoverflow.com/Questtions/4089443
Dupliqué possible de trouver la tangente d'un point sur une courbe cubique bézier (sur un iPhone)
Vraiment, cette question est un duplicata d'un certain nombre d'autres sur le site. Malheureusement aussi, l'Astucieux, Aleks, semble avoir disparu du site pendant plus de 5 ans. J'ai moi-même eu une longue réponse ici, mais ce n'était vraiment qu'un double de l'autre long, excellent, réponses à cette question, alors je l'ai supprimé.