Я хочу найти координаты всех точек, расположенных на ар c, образованных 3 точками.
Прежде всего, я не очень хорошо говорю engli sh, так что извините за язык ошибочен.
Точка 1: (toolPosition.x, toolPosition.y, toolPosition.z) Точка 2: (TMid.transform.position.x, TMid.transform.position.y, TMid .transform.position.z) Точка 3: (TEnd.transform.position.x, TEnd.transform.position.y, TEnd.transform.position.z)
Я в ( x, y, z) координата, где трудность.
Я начал с вычисления координаты центра сферы (x c, y c, z c), этой точки работает.
После того, как я вычислил длину и угол наклона ар c (от точки 1 до точки 3, go через точку 2)
//calcul des angles des points donnés sur la sphère
double tetaA = Math.Acos((toolPosition.z - zc) / rayon);
double tetaB = Math.Acos((TMid.transform.position.z - zc) / rayon);
double tetaC = Math.Acos((TEnd.transform.position.z - zc) / rayon);
double phiA = Math.Atan2((toolPosition.y - yc), (toolPosition.x - xc));
double phiB = Math.Atan2((TMid.transform.position.y - yc), (TMid.transform.position.x - xc));
double phiC = Math.Atan2((TEnd.transform.position.y - yc), (TEnd.transform.position.x - xc));
//longueur des arcs
double longStartEnd = rayon * Math.Acos(Math.Cos(tetaA) * Math.Cos(tetaC) + Math.Sin(tetaA) * Math.Sin(tetaC) * Math.Cos(phiC - phiA));
double longMidEnd = rayon * Math.Acos(Math.Cos(tetaB) * Math.Cos(tetaC) + Math.Sin(tetaB) * Math.Sin(tetaC) * Math.Cos(phiC - phiB));
double longStartMid = rayon * Math.Acos(Math.Cos(tetaA) * Math.Cos(tetaB) + Math.Sin(tetaA) * Math.Sin(tetaB) * Math.Cos(phiB - phiA));
//si le trajet dépasse les 180°
if (longStartMid > longStartEnd || ((float)(longStartEnd * 2) != (float)(2 * Math.PI * rayon) && (float)(longStartMid + longStartEnd + longMidEnd) == (float)(2 * Math.PI * rayon)))
longStartEnd = 2 * Math.PI * rayon - longStartEnd;
//calcul du nombre de découpe à réaliser et de l'angle formé par chacune
int nbrDecoupe = (int)(longStartEnd * 100);
double angle = longStartEnd / rayon;
double angleBeta = angle / nbrDecoupe;
Теперь придем реальная проблема, найти все точки на ар c.
Я пытался вычислить их по матрице вращения, которой нужен вектор нормали.
Вот как я рассчитал ее :
//recherche du vecteur normal du plan formé par les trois points
double xsm = TMid.transform.position.x - toolPosition.x, ysm = TMid.transform.position.y - toolPosition.y, zsm = TMid.transform.position.z - toolPosition.z; // vecteur entre le startPoint et le midPoint
double xse = TEnd.transform.position.x - toolPosition.x, yse = TEnd.transform.position.y - toolPosition.y, zse = TEnd.transform.position.z - toolPosition.z; // vecteur entre le startPoint et le endPoint
double z1 = zse / zsm;
if (Math.Sign(zsm) == Math.Sign(zse))
z1 *= -1;
double y1 = yse / ysm;
if (Math.Sign(ysm) == Math.Sign(yse))
y1 *= -1;
//vecteur normal
double aNormal = 1;
double bNormal = (z1 * xsm + xse) * -1 / (z1 * ysm + yse);
double cNormal = (y1 * xsm + xse) * -1 / (y1 * zsm + zse);
//vecteur normal unitaire
double ux, uy , uz; // ux² + uy² + uz² = 1
ux = 1 / Math.Sqrt(Math.Pow(aNormal, 2) + Math.Pow(bNormal, 2) + Math.Pow(cNormal, 2)) * aNormal * sens;
uy = 1 / Math.Sqrt(Math.Pow(aNormal, 2) + Math.Pow(bNormal, 2) + Math.Pow(cNormal, 2)) * bNormal * sens;
uz = 1 / Math.Sqrt(Math.Pow(aNormal, 2) + Math.Pow(bNormal, 2) + Math.Pow(cNormal, 2)) * cNormal * sens;
* 102 2 * Во-первых, иногда (когда ar c на топоре) bNormal или cNormal делятся на 0.
Во-вторых, я сейчас точно не знаю, как определить сенсор вектора (ar c должен go через точку 2).
Я сделал это, чтобы найти сенсор, но я знаю, что это не хорошее решение
int sens;
if ((TEnd.transform.position.y < toolPosition.y || TEnd.transform.position.z < toolPosition.z) && Math.Abs(TEnd.transform.position.y - toolPosition.y) > 0.00001)
sens = -1;
else
sens = 1;
if (Math.Abs(toolPosition.y - TEnd.transform.position.y) < Math.Abs(toolPosition.y - TMid.transform.position.y))
sens *= -1;
Со всеми этими данными я вычислил все точки:
double xL = toolPosition.x - xc, yL = toolPosition.y - yc, zL = toolPosition.z - zc;
for (int i = 0; i < nbrDecoupe; i++)
{
//Coordonnées du nouveau point
double tempX = xL, tempY = yL;
// xL * (cos() + ux²*(1 - cos())) + yL * (ux*uy*(1 - cos()) - uz*sin()) + zL * (ux*uz*(1 - cos()) + uy*sin())
// xL * (uy*ux*(1 - cos()) + uz*sin()) + yL * (cos() + uy²*(1 - cos())) + zL * (uy*uz*(1 - cos()) - ux*sin())
// xL * (uz*ux*(1 - cos()) - uy*sin()) + yL * (uz*uy*(1 - cos()) + ux*sin()) + zL * (cos() + uz²*(1 - cos()))
xL = tempX * (Math.Cos(angleBeta) + Math.Pow(ux, 2) * (1 - Math.Cos(angleBeta))) + tempY * (ux * uy * (1 - Math.Cos(angleBeta)) - uz * Math.Sin(angleBeta)) + zL * (ux * uz * (1 - Math.Cos(angleBeta)) + uy * Math.Sin(angleBeta));
yL = tempX * (uy * ux * (1 - Math.Cos(angleBeta)) + uz * Math.Sin(angleBeta)) + tempY * (Math.Cos(angleBeta) + Math.Pow(uy, 2) * (1 - Math.Cos(angleBeta))) + zL * (uy * uz * (1 - Math.Cos(angleBeta)) - ux * Math.Sin(angleBeta));
zL = tempX * (uz * ux * (1 - Math.Cos(angleBeta)) - uy * Math.Sin(angleBeta)) + tempY * (uz * uy * (1 - Math.Cos(angleBeta)) + ux * Math.Sin(angleBeta)) + zL * (Math.Cos(angleBeta) + Math.Pow(uz, 2) * (1 - Math.Cos(angleBeta)));
}
Я думаю, что проблема возникает из-за нормального вектора, который иногда не очень хорош.
Итак, две точки на мне нужна помощь, как определить смысл и исчисление вектора (которые на самом деле не работают во всех ситуациях)
Если кто-то может мне помочь, это будет очень благодарно.