Hogyan számolhatom ki ez?
Képzeljétek el hogy van egy 2d objektum kör vagy téglatest mindegy. Erre fogunk ráejteni köröket és téglatesteket.
Amikor ráesnek akkor kicsit túl esnek a felületén és csak ez után állnak meg. És én vissza akarom állítani ezeket a felületre. A az a pozíciót akarom kiszámolni a felületnek amit akkor kapok meg ha a túl esett tárgy mozgási irányát visszafordítom és visszafele mozgatom így megkapom a kívánt felületet ahol érintkeznek éppen de nincs már túl esve rajta. De hogyan számoljam ezt ki.
Csak ezeket használhatom:
mozgási irány pl: Vector2(0,1);
contact pontok
és az ütközött objektum pozícióinak külömbségvectora
Külömbség vec= RáesőObj.pos - Föld.pos
Na ha a fenti esetben ebbe az irányba 0,-1 elkezdem mozgatni(szal visszafele) az objektumot akkor lesz egy olyan pillanat amikor érintkeznek majd egymással de nincs túlmenve rajta sem az egyik sem a másik ez az a pozíció amit tudnom kell. Hogyan?
Két kör akkor érinti egymást, ha a középpontjaik távolsága egyenlõ a sugaruk összegével.
r1 + r2 = VectorLength(s1 - s2);
ahol:
r1 - a nagykör sugara
r2 - a kiskör sugara
s1 - a nagykör középpontja
s2 - a kiskör középpontja
Az ábrán látható két szaggatott vonal metszéspontja lesz az a pont, ahova a kiskör középpontját kell tenni, hogy a kiskör érintse a nagykört.
Itt van hozzá a forráskód:
function LineSphereIntersection(const sphere : TDotSphere; const line :
TDotLine; var CommonPoint1, CommonPoint2 : TDotVector3) : TCommonPointState ;
var
xA, yA, zA, // A(xA,yA,zA) and B(xB,yB,zB) are two different points on the
line.
xB, yB, zB,
xC, yC, zC, // C(xC,yC,zC) is the center of the sphere.
r: Double; // r is the radius of the sphere
a, b, c, d, d1, d2, Delta: Double;
begin
xA := line.p.x;
yA := line.p.y;
zA := line.p.z;
xB := xA - line.v.x;
yB := yA - line.v.y;
zB := zA - line.v.z;
xC := sphere.s.x;
yC := sphere.s.y;
zC := sphere.s.z;
r := sphere.r;
a := sqr(xB-xA) + sqr(yB-yA) + sqr(zB-zA);
b := 2*((xB-xA)*(xA-xC) + (yB-yA)*(yA-yC) + (zB-zA)*(zA-zC));
c := sqr(xA-xC) + sqr(yA-yC) + sqr(zA-zC) - sqr(r);
Delta := sqr(b) - 4*a*c;
if (Delta < 0) then
begin
// There is no intersection.
Result := cpsNoIntersection;
end
else
if (Delta = 0) then
begin
// There is a single intersection point (the line touches the sphere).
d := -b/(2*a);
CommonPoint1.x := xA + d*(xB - xA);
CommonPoint1.y := yA + d*(yB - yA);
CommonPoint1.z := zA + d*(zB - zA);
Result := cpsOneCommonPoint;
end
else
//if (Delta > 0) then
begin
// There are a two intersection points.
d1 := (-b - sqrt(Delta))/(2*a);
d2 := (-b + sqrt(Delta))/(2*a);
CommonPoint1.x := xA + d1*(xB - xA);
CommonPoint1.y := yA + d1*(yB - yA);
CommonPoint1.z := zA + d1*(zB - zA);
CommonPoint2.x := xA + d2*(xB - xA);
CommonPoint2.y := yA + d2*(yB - yA);
CommonPoint2.z := zA + d2*(zB - zA);
Result := cpsTwoCommonPoints;
end;
end ;
begin
sphere.s := s1; // A nagykör középpontja.
sphere.r := r1 + r2; // A nagykör és a kiskör sugarának összege.
line.p := s2; // A kiskör középpontja.
line.v := v; // A kiskör mozgási iránya.
LineSphereIntersection(sphere, line, CommonPoint1, CommonPoint2);
s2 := CommonPoint1; // A kiskör új középpontja.
end.
Köszi utolsó válaszoló így már megtudtam csinálni.
"Két kör akkor érinti egymást, ha a középpontjaik távolsága egyenlõ a sugaruk összegével."
Ezek azok a válaszok amiket értek és szeretek.
Van olyan weboldal ahol ez le van írva több alakzatra is?
Pl:
Mikor érintik egymást ezek
Két téglalap
Két háromszög
Egy téglalap és egy kör.
Egy kapszula collider alakzat és egy kör,négyzet
Akarnám tudni ezeket de nem találok a neten semmit.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!