Question

J'ai une équation pour une courbe parabolique croisant un point spécifié, dans mon cas où l'utilisateur a cliqué sur un graphique.

 // this would typically be mouse coords on the graph
 var _target:Point = new Point(100, 50);

 public static function plot(x:Number, target:Point):Number{
  return (x * x) / target.x * (target.y / target.x);
 }

Cela donne un graphique comme celui-ci:

courbe parabolique

I ai aussi une série de segments de ligne définis par les coordonnées de début et de fin:

startX:Number, startY:Number, endX:Number, endY:Number

Je dois trouver si et où cette courbe coupe ces segments (A):

text alt

Si c'est une aide, startX est toujours < endX

Je reçois le sentiment qu'il est un savoir assez simple voie à suivre pour ce faire, mais je ne suis pas vraiment quoi chercher, et je ne suis très bien versé dans « bon » mathématiques, des exemples de code si réels seraient très appréciés .

Mise à jour:

J'ai l'intersection de travail, mais ma solution me donne la coordonnée du mauvais côté de l'axe y.

Remplacement coords mes cibles avec A et B respectivement, donne cette équation pour la parcelle:

(x * x) / A * (B/A)

// this simplifies down to:
(B * x * x) / (A * A)

// which i am the equating to the line's equation
(B * x * x) / (A * A) =  m * x + b

// i run this through wolfram alpha (because i have no idea what i'm doing) and get:
(A * A * m - A * Math.sqrt(A * A * m * m + 4 * b * B)) / (2 * B)

est une bonne réponse, mais je veux la deuxième variante possible. J'ai réussi à corriger cela en multipliant m avec -1 avant le calcul et faire la même chose avec la valeur x les derniers de retour de calcul, mais qui se sent comme un hack.

SOLUTION:

 public static function intersectsSegment(targetX:Number, targetY:Number, startX:Number, startY:Number, endX:Number, endY:Number):Point {
  // slope of the line
  var m:Number = (endY - startY) / (endX - startX);

  // where the line intersects the y-axis
  var b:Number = startY - startX * m;

  // solve the two variatons of the equation, we may need both
  var ix1:Number = solve(targetX, targetY, m, b);
  var ix2:Number = solveInverse(targetX, targetY, m, b);

  var intersection1:Point;
  var intersection2:Point;

  // if the intersection is outside the line segment startX/endX it's discarded
  if (ix1 > startX && ix1 < endX) intersection1 = new Point(ix1, plot(ix1, targetX, targetY));
  if (ix2 > startX && ix2 < endX) intersection2 = new Point(ix2, plot(ix2, targetX, targetY));

  // somewhat fiddly code to return the smallest set intersection
  if (intersection1 && intersection2) {
   // return the intersection with the smaller x value
   return intersection1.x < intersection2.x ? intersection1 : intersection2;
  } else if (intersection1) {
   return intersection1;
  }

  // this effectively means that we return intersection2 or if that's unset, null
  return intersection2;
 }

 private static function solve(A:Number, B:Number, m:Number, b:Number):Number {
  return (m + Math.sqrt(4 * (B / (A * A)) * b + m * m)) / (2 * (B / (A * A)));
 }

 private static function solveInverse(A:Number, B:Number, m:Number, b:Number):Number {
  return (m - Math.sqrt(4 * (B / (A * A)) * b + m * m)) / (2 * (B / (A * A)));
 }

 public static function plot(x:Number, targetX:Number, targetY:Number):Number{
  return (targetY * x * x) / (targetX * targetX);
 }
Était-ce utile?

La solution

Ou, encore plus explicite.

Si votre courbe parabolique est y(x)= A x2+ B x + C (Eq 1)

et votre ligne est y(x) = m x + b (Eq 2)

Les deux solutions possibles (+ et -) pour x sont

x = ((-B + m +- Sqrt[4 A b + B^2 - 4 A C - 2 B m + m^2])/(2 A))   (Eq 3)

Vous devriez vérifier si vos points d'extrémité du segment (en x) contient l'une de ces deux points. Si elles le font, il suffit de remplacer x correspondant dans la m y = x + b équation pour obtenir la coordonnée y pour l'intersection

Modifier>

Pour obtenir la dernière équation que vous venez de dire que le « y » dans l'équation 1 est égale à la « y » dans l'équation 2 (parce que vous êtes à la recherche d'une intersection!). Cela vous donne:

A x2+ B x + C = m x + b

et le regroupement

A x2+ (B-m) x + (C-b) = 0

Ce qui est une équation du second degré.

L'équation 3 ne sont que les deux solutions possibles pour ce second degré.

Edit 2>

re-lecture de votre code, il semble que votre parabole est définie par y(x) = A x2


A = (target.y / (target.x)2)

Donc dans votre cas l'équation 3 devient simplement

 x = ((m +- Sqrt[4 A b + m^2])/(2 A))   (Eq 3b)  

HTH!

Autres conseils

Prenez l'équation de la courbe et de mettre votre ligne en y = mx + b. Solve pour x et déterminer si X est entre vos points de départ et de fin pour vous en ligne segment.

Départ: http://mathcentral.uregina.ca/ QQ / base de données / QQ.09.03 / senthil1.html

Ce que tu fais assez souvent pour souhaiter un test séparé pour voir s'il existe une intersection avant en fait le calcul du point d'intersection? Dans ce cas, tenir compte du fait que votre parabole est un niveau fixé pour la fonction f (x, y) = y - (B * x * x) / (A * A) - Plus précisément, celui pour lequel f (x, y) = 0. Branchez vos deux points de terminaison dans f (x, y) - si elles ont le même signe, ils sont sur le même côté de la parabole, alors que s'ils ont des signes différents, ils sont sur les différents côtés de la parabole.

Maintenant, vous pourriez encore avoir un segment qui coupe la parabole deux fois , et ce test ne se coince pas. Mais quelque chose sur la façon dont vous définissez le problème me fait sentir que peut-être c'est OK pour votre application.

En d'autres termes, vous devez calulate l'équation pour chaque segment de ligne y = Ax + B comparer à l'équation de la courbe y = Cx^2 + Dx + E donc Ax + B - Cx^2 - Dx - E = 0 et voir s'il y a une solution entre les valeurs de startX et endX.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top