Home   Help Search Login Register  

Author Topic: circle line intervention  (Read 344 times)

0 Members and 1 Guest are viewing this topic.

Andreas Toast

  • Guest
circle line intervention
« 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.


Andreas Toast

  • Guest
Re:circle line intervention
« Reply #1 on: 30 Jun 2004, 15:09:02 »
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

Andreas Toast

  • Guest
Re:circle line intervention
« Reply #2 on: 02 Jul 2004, 14:40:27 »
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