OFPEC Forum
Editors Depot - Mission Editing and Scripting => OFP - Editing/Scripting General => Topic started by: Andreas Toast on 27 Jun 2004, 19:56:20
-
hi
I need a way to say a soldiers to avoid a circle area.
By using dynamic waypoints (setmarkerpos etc.) that is no
problem. But :
I need to know the two intersection of a circle and a line (the line goes through the circle is assumed) - of course I know
that you can but the line function
y=m*x+b into the function of a circle x^2+(m*x+b)-r^2 = 0
and them calculate the two x parameters.
Im pretty sure I will make it but perhaps anyone has coded or seen an algorithmus for that problem.
-
for anyone heres the answer to my problem (in c ofp function soon follows)
ah : meinkreis = mycircle
meinelinie = myline
//-------------------------
struct kreis{
float radius;
float x,y;
};
struct linie2p{
float x1,y1;
float x2,y2;
float m;
float b;
};
kreis meinkreis;
linie2p meinelinie;
meinkreis.radius = 19;
meinkreis.x = 50;
meinkreis.y = 70;
meinelinie.x1 = 0;
meinelinie.y1 = 0;
meinelinie.x2 = 3;
meinelinie.y2 = 6;
meinelinie.m = (meinelinie.y2 - meinelinie.y1)
/ (meinelinie.x2 - meinelinie.x1);
//meinelinie.b = meinelinie.y1 - meinelinie.m * meinelinie.x1;
//meinelinie.b = meinelinie.x1 - (meinelinie.y1/meinelinie.m);
meinelinie.b = meinelinie.y1-(meinelinie.m * meinelinie.x1) ;
float d,a,b,c,x1,x2,y1,y2;
b = - 2* meinkreis.x + 2 * meinelinie.b*meinelinie.m -
2 * meinkreis.y * meinelinie.m;
a = 1 + (meinelinie.m*meinelinie.m);
c = (meinkreis.x*meinkreis.x) + (meinelinie.b*meinelinie.b) +
(2 * meinkreis.y * meinelinie.b) + (meinkreis.y*meinkreis.y)-
(meinkreis.radius*meinkreis.radius);
d = (b*b)-(4* a *c);
x1 = (-b + sqrt(d))/(2*a);
x2 = (-b - sqrt(d))/(2*a);
y1 = (meinelinie.m*x1)+meinelinie.b;
y2 = (meinelinie.m*x2)+meinelinie.b;
cu
-
hi.
here is the circle line intersection as ofp script :
a function follows soon.
;// -------------------------------
;// eine DASPARADOXON.DE produktion
;// script (c) 2004 by CPU (dpsf)
;// -------------------------------
;//
;// Name : KreisGrade 0.0.3 (thx an iratu für mathematisches geleit)
;// Parameter : Kreismittelpunkt, Kreisradius, Gerade Punkt A, Gerade Punkt B
;//
;// ÜBERGEBENE VARRIABLEN Parameter 0 => Kreismittelpunkt X
;// Parameter 1 => Kreismittelpunkt y
;// Parameter 2 => Kreisradius
;// Parameter 3 => Gerade A x
;// Parameter 4 => Gerade A y
;// Parameter 5 => Gerade B x
;// Parameter 6 => Gerade B y
;//
;//
;// INTERNE VARIABLEN :
;// _GM = Steigung der Geraden
;// _GB = Y-Achsenabschnitt der Geraden
;//
;// Rückgabewert : Schnittpunktanzahl, Punkt S1, Punkt S2
_KMX = _this select 0
_KMY = _this select 1
_KMR = _this select 2
_AX = _this select 3
_AY = _this select 4
_BX = _this select 5
_BY = _this select 6
;// meinelinie.m
_GM = (_BY - _AY) / (_BX - _AX)
;// meinelinie.b = meinelinie.y1-(meinelinie.m * meinelinie.x1)
_GB = _AY - ( _GM * _AX )
;// b = - 2* meinkreis.x + 2 * meinelinie.b*meinelinie.m -
;// 2 * meinkreis.y * meinelinie.m;
_QGB1 = -(2 * _KMX)
_QGB2 = (2 * _GB * _GM)
_QGB3 = (2 * _KMY * _GM)
_QGB = _QGB1
_QGB = _QGB + _QGB2
_QGB = _QGB + _QGB3
;// a = 1 + (meinelinie.m*meinelinie.m);
_QGA = 1 + _GM * _GM
;// c = (meinkreis.x*meinkreis.x) + (meinelinie.b*meinelinie.b) +
;// (2 * meinkreis.y * meinelinie.b) + (meinkreis.y*meinkreis.y)-
;// (meinkreis.radius*meinkreis.radius);
_QGC = _KMX^2+_GB^2+(2*_KMY*_GB)+_KMY^2-_KMR^2
;//d = (b*b)-(4* a *c)
_QGD = _QGB^2-(4*((_QGA*_QGC)))
;//x1 = (-b + sqrt(d))/(2*a);
_X1 = (-_QGB + sqrt(_QGD))/(2*_QGA)
_X2 = (-_QGB - sqrt(_QGD))/(2*_QGA)
;// y1 = (meinelinie.m*x1)+meinelinie.b;
_Y1 = (_GM*_X1)+_GB
_Y2 = (_GM*_X2)+_GB
;//-------------------------------------------
_AUSGABE2 = format["Schnittpunkt %1/%2 : %3/%4 : %5/%6 : %7 : GM:%8 GB:%9",_KMX,_KMY,_KMR,_AX,_AY,_BX,_BY,_GM,_GB]
_AUSGABE = format["Schnittpunkt %1/%2 : %3/%4 : GBA:%5 GBB : %6 GBC: %7 QGD: %8",_X1,_Y1,_X2,_Y2,_QGA,_QGB,_QGC,_QGD]
SPIELER globalchat _AUSGABE2
SPIELER globalchat _AUSGABE
exit