아 이런 방법이 있다
생각해보니 켐버스 지정할때 선이다
즉 직사각형이다
즉 각도가 그냥 90도 0도 니깐 훨 쉽게 만들수 있다
그럼 식을 더 간단하게 쓸수있다
https://www.desmos.com/calculator/c7gbcpnof8
그림보면 딱 나온다 그냥 x랑 갑 주고 켐퍼스 안에있는지 만 봐주면... 끝>??이런.. 젠장
$\ D\left(x\right)=\ \frac{\left(y_{1}-y_{2}\right)}{x_{1}-x_{2}}\left(x-x_{1}\right)\ \ +\ y_{1} $
$\ Q\left(y\right)\ =\ \frac{\left(x_{1}-x_{2}\right)}{\left(y_{1}-y_{2}\right)}\left(\ y\ -\ y_{1}\right)\ +\ \ x_{1} $
식은 이런식으로 작성하였다 이제 x값 넣으면 그값에 따라 값을 반환해준다
그리고 그값이 저 켐퍼스 크기안에 있으면 됨
t_xy *ft_intersectionpoint_canvar(t_dot dot1, t_dot dot2)
{
float x1 = (dot1.x - dot2.x) / (dot1.y - dot2.y) * (CANVAS_Y - dot1.y) + dot1.x;
float x2 = (dot1.x - dot2.x) / (dot1.y - dot2.y) * (CANVAS_HEIGHT - dot1.y) + dot1.x;
float y1 = (dot1.y - dot2.y) / (dot1.x - dot2.x) * (CANVAS_X - dot1.x) + dot1.y;
float y2 = (dot1.y - dot2.y) / (dot1.x - dot2.x) * (CANVAS_WIDTH - dot1.x) + dot1.y;
if (dot1.y - dot2.y == 0)
{
x1 = CANVAS_X;
x2 = CANVAS_WIDTH;
}
if (dot1.x - dot2.x == 0)
{
y1 = CANVAS_Y;
y2 = CANVAS_HEIGHT;
}
printf("%f %f %f %f \n",dot1.x, dot1.y ,dot2.x, dot2.y);
printf("x1 : %f \nx2 :%f \ny1: %f \ny2: %f \n", x1,x2,y1,y2);
}
그리고 예외처리까지 하면
#include <ft_canvas.h>
t_line *ft_intersectionpoint_canvar(t_dot dot1, t_dot dot2, t_line *c_line_ptr)
{
t_line c_line;
if (dot1.y <= CANVAS_Y && dot2.x - dot1.x)
c_line.dot1.x = (dot1.x - dot2.x) / (dot1.y - dot2.y) * (CANVAS_Y - dot1.y) + dot1.x;
else if (CANVAS_HEIGHT <= dot1.y && dot2.x - dot1.x)
c_line.dot1.x = (dot1.x - dot2.x) / (dot1.y - dot2.y) * (CANVAS_HEIGHT - dot1.y) + dot1.x;
else
c_line.dot1.x = ft_max_f(CANVAS_X, ft_min_f(dot1.x, CANVAS_WIDTH));
if (dot2.y <= CANVAS_Y && dot2.x - dot1.x)
c_line.dot2.x = (dot2.x - dot1.x) / (dot2.y - dot1.y) * (CANVAS_Y - dot2.y) + dot2.x;
else if (CANVAS_HEIGHT <= dot2.y && dot2.x - dot1.x)
c_line.dot2.x = (dot2.x - dot1.x) / (dot2.y - dot1.y) * (CANVAS_HEIGHT - dot2.y) + dot2.x;
else
c_line.dot2.x = ft_max_f(CANVAS_X, ft_min_f(dot2.x, CANVAS_WIDTH));
if (dot1.x <= CANVAS_X && dot2.y - dot1.y)
c_line.dot1.y = (dot1.y - dot2.y) / (dot1.x - dot2.x) * (CANVAS_X - dot1.x) + dot1.y;
else if (CANVAS_WIDTH <= dot1.x && dot2.y - dot1.y)
c_line.dot1.y = (dot1.y - dot2.y) / (dot1.x - dot2.x) * (CANVAS_WIDTH - dot1.x) + dot1.y;
else
c_line.dot1.y = ft_max_f(CANVAS_Y, ft_min_f(dot1.y , CANVAS_HEIGHT));
if (dot2.x <= CANVAS_X && dot2.y - dot1.y)
c_line.dot2.y = (dot2.y - dot1.y) / (dot2.x - dot1.x) * (CANVAS_X - dot2.x) + dot2.y;
else if (CANVAS_WIDTH <= dot2.x && dot2.y - dot1.y)
c_line.dot2.y = (dot2.y - dot1.y) / (dot2.x - dot1.x) * (CANVAS_WIDTH - dot2.x) + dot2.y;
else
c_line.dot2.y = ft_max_f(CANVAS_Y, ft_min_f(dot2.y , CANVAS_HEIGHT));
*c_line_ptr = c_line;
return (c_line_ptr);
}
(오타있엇음 수정함)
이제 범위가 넘어도 엄청 빠르다 ㅎㅎ