点が三角形の外接円の内側にあるかどうか

point-in-triangles-outer-circle.png
bool CTriangle::IsInMyCircumCircle(CVertex *_p){
    if(this->IsMyVertex(_p))return false;
    if(this->circumCircle==0){this->CalcCircumCircle();}
    return this->circumCircle->PointInCircle(_p);
}
bool CTriangle::IsInMyCircumCircle2(CVertex *_p){
    //平面上の4点の行列式バージョン
    if(this->IsMyVertex(_p))return false;
    //
    //|ax,ay,ax^2+ay^2,1| |ax-px,ay-py,(ax^2-px^2)+(ay^2-py^2)|
    //|bx,by,bx^2+by^2,1|=|bx-px,by-py,(bx^2-px^2)+(by^2-py^2)|>0
    //|cx,cy,cx^2+cy^2,1| |cx-px,cy-py,(cx^2-px^2)+(cy^2-py^2)|
    //|px,py,px^2+py^2,1| 
    //右辺の3×3の行列をつくる
    //|0,1,2|
    //|3,4,5|
    //|6,7,8|
    //a,b,cは反時計周りに並んでいなければならない。
 
    double matrix[9];
    double pvalue=(_p->x*_p->x+_p->y*_p->y);
    matrix[0]=a->x-_p->x;matrix[1]=a->y-_p->y;matrix[2]=(a->x*a->x+a->y*a->y)-pvalue;
    matrix[3]=b->x-_p->x;matrix[4]=b->y-_p->y;matrix[5]=(b->x*b->x+b->y*b->y)-pvalue;
    matrix[6]=c->x-_p->x;matrix[7]=c->y-_p->y;matrix[8]=(c->x*c->x+c->y*c->y)-pvalue;
 
    //サラスの公式
    double det=
    (matrix[0]*matrix[4]*matrix[8]+matrix[3]*matrix[7]*matrix[2]+matrix[6]*matrix[1]*matrix[5])
    -
    (matrix[2]*matrix[4]*matrix[6]+matrix[5]*matrix[7]*matrix[0]+matrix[1]*matrix[3]*matrix[8]);
 
    if(det>0){return true;}else{return false;}
 
}

circle collision-detection triangle

サポートサイト Wikidot.com circlecollision-detectiontriangle