카테고리 없음

[FDF] 아.. 하다보니 4점을 이용한 교점 찾기 효율 업

아 이런 방법이 있다 

생각해보니 켐버스 지정할때 선이다

즉 직사각형이다

즉 각도가 그냥 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);
}

(오타있엇음 수정함)

이제 범위가 넘어도 엄청 빠르다 ㅎㅎ