29/09/2012-23:20
여기에 git Repo를 만들었습니다 :
https://github.com/ArthurWulfWhite/Bezier-Distance/
여기에서 소스 파일을 zip으로 다운로드 할 수 있습니다. FlashDevelop를 사용하여 컴파일 할 수있는 데모도 포함되어 있습니다. 데모를 사용하려면 Flash Develop에서 프로젝트를 열고 '프로젝트 테스트'를 클릭하십시오. 데모를 실행하는 동안 좌 클릭을 클릭하여 새 베 지어 곡선과 새 원을 무작위로 지정하십시오.
행운을 빕니다!
zip 링크는 잘 보이지 않습니다. Ctrl + F를 사용하고 zip을 입력하십시오. 이 소스는 몇 주 동안의 연구와 프로그래밍을 의미합니다.
베 지어를 재귀 적으로 세그먼트로 나누고 충돌을 확인하려는 경우 100,100 배열 (그리드)을 만들고 각 세그먼트를 가장 가까운 네 개의 사각형에 배치하는 것이 좋습니다. 각 프레임을 분할합니다.
프로그래머와 게임 제작자 모두에게 box2d의 이점이 있다고 생각합니다. 모션을 약간 울퉁불퉁하고 유동적으로 보이게하는 '단순한'물리 엔진을 만드는 데 숨겨진 작은 장애물이 많이 있기 때문입니다.
오래된 대답 : 순수한 길.
실제로 원의 중심과 곡선에서 가장 가까운 점 사이의 거리를 확인하여 원이 베 지어 곡선과 충돌하는지 확인할 수 있습니다.
거리에 대한 방정식 (일반)
설명 :
베 지어 방정식 :
q(t) = (1-t) * ((1-t) * start.(x,y) + t * control.(x,y)) + t*(t * control.(x,y) + (1 - t) * end.(x,y))
이것은 (대수와 함께) 요약 될 수 있습니다-가독성을 위해. (x, y)를 생략합니다 (여전히 숫자가 아니라 포인트입니다)
q(t) = (start -2 * cont + end) t^2 + (-2 * start + 2 * control) + start
점 (x, y)과의 거리는 다음과 같습니다.
sqrt ((q(t).x - point.x)^2 + (q(t).y - point.y)^2)
베 지어에서 볼에 가장 가까운 점을 찾으려면 도함수가 0 (근) 인 모든 점을 도출하고 찾아야합니다. 3 차 다항식이므로 닫힌 수식을 사용할 수 있지만 컴퓨터 부동 소수점으로 표현 된 분수의 정밀도가 충분하지 않을 수 있으므로 신뢰할 수 없습니다. 뉴턴이나 그 성격의 것을 사용하는 것이 훨씬 좋습니다.
근을 찾아야하는 파생 상품은 다음과 같습니다.
가정 : a = 시작 b = 제어 c = 끝 d = cirlce 중심점
까다로운 부분은이 점을 곱하는 것이므로 내적을 사용해야합니다.
원하는 경우이 코드가 있으며 충돌 여부와 충돌 각도가 있으면 부울을 반환하는 함수 형태로 여기에서 공유 할 수 있습니다. 이와 같은 충돌 엔진의 순진한 구현에서 일부 문제가 나타날 수 있는데, 예를 들어 빠르게 움직이는 볼이 두 곡선 사이에 끼일 수 있습니다.
지금은 피하는 것이 좋습니다. x 축과 y 축의 계수를 합산하여 합산하십시오.
뉴턴처럼 루트를 찾고 신뢰할 수있는 방법을 사용하여 근을 찾고 베 지어의 근점에서 원 중심까지의 거리를 확인하고 베 지어의 두 끝의 거리를 확인하십시오 (시작 그리고 끝) 가장 가까운 곳의 중심에 충돌이 있는지 알려줍니다.
반경이 최소 거리보다 작은 경우 충돌이 발생합니다.
각도는 대략 원의 중심과 베 지어의 가장 가까운 점 사이의 각도입니다.
즉, 충돌 물리학으로 게임을 만들고 싶다면 베 지어를 반복하는 것이 좋습니다.
q(t) = (1-t) * ((1-t) * start.(x,y) + t * control.(x,y)) + t*(t * control.(x,y) + (1 - t) * end.(x,y))
중간 크기의 각 조각을 충분히 작아 질 때까지 재귀 적으로 나누고 10 픽셀 이하로 말한 다음 상자에서 대략 베 지어를 만들고 물리학에 Box2d 를 사용 하면이 충돌 감지 코드를 모두 작성할 수 있습니다. 게임 플레이를 많이 향상시키지 않는 시간 싱크. Box2d 사용은 과거 수많은 프로젝트에서 입증되었습니다.