본문 바로가기
반응형

수학42

유니티 - 직선을 N등분 하기 (Dividing a Line) Unity 전체 링크 직선을 나누는 방법은 간단하다. 아래와 같이 두 점과 몇 개로 나눌지 입력받은 함수를 나눈 뒤, 두 점을 빼고 N등분 한 후 하나씩 더해주면 된다. List getDivideLinePoint(Vector3 a, Vector3 b, int n) { Vector3 divide = (b - a) / n; List points = new List(); for(int i = 1; i < n; i++) points.Add(a + divide * i); return points; } 두 점은 public으로 선언해서 Inspector에서 받도록 하자. 여기서는 임의의 큐브를 생성해서 배치하였다. N등분하는 점들의 좌표를 눈으로 보기 쉽도록 CreatePrimitive를 이용하자. List poi.. 2022. 11. 23.
유니티 - 여러 구멍들이 있는 다각형의 삼각분할 (Polygon Triangulation with Holes) Unity 전체 링크 참고 - CreatePrimitive로 기본 오브젝트 만들기 - 오목 다각형의 삼각분할 (Polygon Triangulation) - 구멍이 있는 다각형의 삼각분할 (Polygon Triangulation with One Hole) - 여러 구멍들이 있는 다각형의 삼각분할 (Polygon Triangulation with Holes) 구멍이 하나만 있는 다각형의 삼각분할을 여러번 사용하면 구멍이 여러 개 있어도 처리가 가능하다. 다각형에 구멍 하나가 있어도 결국 하나의 다각형이기 때문에 여기에 다시 구멍을 뚫으면 된다. 단, 여기서는 구멍이 완전히 다각형 내부에만 존재하고, 구멍끼리는 겹치지 않는다고 가정하자. Settings 이전 글을 참고하여 여기서도 Hole을 2개 더 추가한다.. 2022. 11. 5.
유니티 - 구멍이 있는 다각형의 삼각분할 (Polygon Triangulation with One Hole) Unity 전체 링크 참고 - CreatePrimitive로 기본 오브젝트 만들기 - 오목 다각형의 삼각분할 (Polygon Triangulation) - 구멍이 있는 다각형의 삼각분할 (Polygon Triangulation with One Hole) - 여러 구멍들이 있는 다각형의 삼각분할 (Polygon Triangulation with Holes) (오목) 다각형의 삼각분할은 구멍이 없는 경우에 다각형을 삼각형으로 분할하였다. 하지만 오목 다각형 삼각분할 알고리즘을 잘 보완해서 적용하면 구멍이 있더라도 삼각분할이 가능하다. 오목 다각형 삼각분할 알고리즘 with Hole 아래와 같이 점 0, 1, 2, 3으로 주어진 사각형 내부에 점 4, 5, 6으로 주어진 삼각형 구멍이 있다고 하자. 여기서 삼.. 2022. 11. 4.
유니티 - 다각형 안에 있는 점 판단하기 (How to Check If a Point Is Inside a Polygon) Unity 전체 링크 삼각형 안에 있는 점 또는 사각형 안에 있는 점은 삼각형의 넓이를 이용하여 내부 점을 판단했다. 하지만 아래와 같이 복잡한 모양의 다각형은 넓이로 내부와 외부의 점을 판단하기 힘들다. 이 경우에는 판단해야하는 점에 대해 적절한 선분(반직선)을 그린다. 그리고 각 다각형의 모서리와 교점의 개수로 내부와 외부를 판단할 수 있다. 외부에 있는 큐브의 경우 교점이 2개다. 즉, 교점이 짝수라면 외부라고 판단할 수 있다. 아래의 큐브는 내부에 있다. 마찬가지로 직선을 그어보면 교점이 3개다. 따라서, 교점이 홀수라면 내부라고 판단할 수 있다. 직선을 이을 때, 직선의 교점이 아니라 점과 완전히 일치하는 경우에는 방어코드가 필요하다. 여기서는 적절한 오차를 허용하였으므로 따로 방어코드를 추가하.. 2022. 11. 4.
유니티 - 오목 다각형의 삼각분할 (Polygon Triangulation) Unity 전체 링크 참고 - 2차원 평면에서 유한한 선의 교점 구하기 - 삼각형 안에 있는 점 판단하기 - 퍼블릭 변수 변경시 이벤트 발생 - 오목 다각형의 삼각분할 (Polygon Triangulation) - 구멍이 있는 다각형의 삼각분할 (Polygon Triangulation with One Hole) - 여러 구멍들이 있는 다각형의 삼각분할 (Polygon Triangulation with Holes) 출처 - https://alienryderflex.com/polygon_triangulation_with_hole.shtml 위 링크를 바탕으로 유니티에서 구현하였습니다. 다각형의 삼각분할 점이 N개인 다각형이라면 N - 2개의 삼각형으로 나눌 수 있다. 아래 그림의 별처럼 꼭 N - 2개의 삼.. 2022. 10. 29.
유니티 - 2차원 평면에서 유한한 선의 교점 구하기 (Intersection of Two Finite Lines in 2-Dimension) Unity 전체 링크 2차원 평면 (y = 0)에서 길이가 정해진 두 개의 선의 교차점을 구해보자. 점 (x1, y1)과 점 (x2, y2)를 지나는 직선과 점 (x3, y3)와 점 (x4, y4)를 지나는 직선이 있을 때, Cross를 다음과 같이 정의하자. Cross가 0인 경우는 두 직선이 평행(parallel)한 경우다. 그리고 Cross가 0이 아니라면 두 직선의 교점 (X, Y)는 다음과 같다. 따라서 교차하는지 검사하는 함수는 다음과 같다. (y = 0인 공간이므로 y → z로 변경) bool CrossCheck2D(Vector3 a, Vector3 b, Vector3 c, Vector3 d) { // (x, 0, z) float x1, x2, x3, x4, z1, z2, z3, z4, X,.. 2022. 10. 29.
유니티 - 삼각형 안에 있는 점 판단하기 (How to Check If a Point Is Inside a Triangle) Unity 전체 링크 참고 - 사각형 안에 있는 점 판단하기 - 다각형 안에 있는 점 판단하기 삼각형 안에 한 점이 있다는 것은 삼각형의 넓이를 이용해서 판단할 수 있다. 삼각형의 꼭짓점 dot1, 2, 3과 내부에 있는지 검사해야할 점이 있다고 하자. 그러면 dot1, 2, 3가 만드는 삼각형의 넓이는 dot12, dot23, dot31과 내부의 점에 의해 만들어진 삼각형의 넓이와 같아야 한다. 삼각형의 넓이는 아래의 함수로 구할 수 있다. float getAreaOfTriangle(Vector3 dot1, Vector3 dot2, Vector3 dot3) { Vector3 a = dot2 - dot1; Vector3 b = dot3 - dot1; Vector3 cross = Vector3.Cross(.. 2022. 10. 29.
100명의 죄수가 살아남을 확률을 높이기 위한 루프 전략 (Loop Strategy) C, C++ 전체 링크 무한히 작은 확률을 30%까지 올리는 기적의 전략 확률 1000000000000000000000000000000배 높이기 구현 with Veritasium https://www.youtube.com/watch?v=PE4vLbyOgw0 ▲ 유튜버 베리타시움의 영상인 퀴즈를 직접 구현해보자. 영상이 길다면 fmkorea의 요약본을 보자. 1부터 100까지 번호가 매겨진 죄수가 있다. 이때 각 죄수의 번호가 적힌 쪽지가 100개의 상자에 무작위로 담겨있다. 죄수들은 한 번에 한 명씩 방에 들어가서 50개의 상자를 열 수 있다. - 이때, 자신의 번호를 찾아야 한다. 50개를 모두 열어본 후에는 방을 들어왔던 상태와 완벽히 동일하게 복구하고 나가야 한다. 만약 100명의 죄수가 모두 자신.. 2022. 9. 24.
원주율 Pi : 라이프니츠 공식 (Leibniz Formula for π) C, C++ 전체 링크 라이프니트 원주율 공식은 아래와 같은 분모가 홀수인 값의 교대 급수에서 유도된다. 따라서 원주율 π (pi)는 교대 급수에 4를 곱한 값이 된다. precisionCount를 넘겨 받는 메서드를 만들어서 정밀도를 확인해보자. #include double pi(int precisionCount) { double leibniz = 0; int odd = 1; int inverse = 1; for (int i = 0; i < precisionCount; i++, odd += 2, inverse *= -1) { leibniz += 1 / (double)(odd * inverse); } return 4.0 * leibniz; } int main() { printf("%.15f\n", pi(.. 2022. 8. 1.
반응형