Cramers Rule·Î µÎ Á÷¼± ±³Á¡ ±¸Çϱâ

Cramers Rule(Å©·¡¸Ó ¶Ç´Â Å©¶ó¸Þ¸£)·Î µÎ Á÷¼±ÀÇ ±³Á¡À» ±¸ÇØ º»´Ù.

µÎ Á¡ P1, P2°¡ ÀÖÀ»¶§ ¼±ÀÇ ÀϹݽÄ

(µÎ Á¡À¸·Î Á÷¼±ÀÇ ÀÏ¹Ý½Ä ¸¸µé±â¸¦ ÂüÁ¶ ÇÑ´Ù)


Å©·¡¸ÓÀÇ ¹ýÄ¢À¸·Î ÇØ ±¸Çϱâ


ÆǺ°½Ä D´Â ´ÙÀ½°ú °°ÀÌ ±¸ÇÑ´Ù.



¿¹)
4x - 3y = -14
3x -5y = -5


= 4*(-5) - (-3)*(-3)
= -20 - (-9)
= -11

ÆǺ°½Ä Dx, Dyµµ °°ÀÌ ±¸ÇØ º¸ÀÚ.




= (-14)*(-5)-(-5)*(-3)
= 70 - 15
= 55


= 4*(-5)-(3)(-14)
=-20-(-42)
=-20+42
=22

°á°ú´Â ´ÙÀ½°ú °°ÀÌ ±¸ ÇÒ¼ö ÀÖ´Ù.
x = Dx / D = 55 / -11 = -5
y = Dy / D = 22 / -11 = -2

C++ ¼Ò½º
#include <stdio.h>
#include <math.h>

class Point2
{
public:
    float x, y;

    Point2() :  x(0.0f), y(0.0f)
    {
    }
    Point2(float x, float y) : x(x), y(y)
    {
    }

    const float& operator[] (int i) const
    {
       return ((&x)[i]);
    }

    float& operator[] (int i)
    {
       return ((&x)[i]);
    }

    Point2& operator =(const Point2& v)
    {
        x = v.x;
        y = v.y;
        return (*this);
    }

    Point2 operator +(const Point2& v) const
    {
        return Point2(x + v.x, y + v.y);
    }

    Point2 operator *(float num) const
    {
        return Point2(x * num, y * num);
    }
};

bool ChecklinesCollide(const Point2& p1, const Point2& p2, 
                const Point2& p3, const Point2& p4, Point2& out)
{
    float A1 = p2.y-p1.y;
    float B1 = p1.x-p2.x;
    float C1 = A1*p1.x + B1*p1.y;
    float A2 = p4.y-p3.y;
    float B2 = p3.x-p4.x;
    float C2 = A2*p3.x + B2*p3.y;
    float det = A1*B2-A2*B1;
    if(det)
    {
        float x = (B2*C1 - B1*C2)/det;
        float y = (A1*C2 - A2*C1)/det;
        if(x >= std::min(p1.x, p2.x) && x <= std::max(p1.x, p2.x)
            && x >= std::min(p3.x, p4.x) && x <= std::max(p3.x, p4.x)
            && y >= std::min(p1.x, p2.y) && y <= std::max(p1.y, p2.y)
            && y >= std::min(p3.x, p4.y) && y <= std::max(p3.y, p4.y))
        {
                out = Point2(x, y);
                return true;
        }
    }
    return false;
}

int main( int argc, char *argv[] )
{
    Point2 p1 = Point2(-5 , -2);
    Point2 p2 = Point2(10 , 18);
    Point2 p3 = Point2(-10 , -5);
    Point2 p4 = Point2(10 , 7);
    Point2 out = Point2(0, 0);
    bool res = ChecklinesCollide(p1, p2, p3, p4, out);
    //res = true, out = -5, -2
 }


Âü°í)
ÆÇ º°½ÄÀ¸·Î Ç®±â
https://ko.wikipedia.org/wiki/Å©¶ó¸Þ¸£_°ø½Ä
https://ericleong.me/research/circle-line/
µÎ Á¡À¸·Î Á÷¼±ÀÇ ÀÏ¹Ý½Ä ¸¸µé±â