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/ µÎ Á¡À¸·Î Á÷¼±ÀÇ ÀÏ¹Ý½Ä ¸¸µé±â |