본문 바로가기
반응형

수학42

유니티 - 벡터의 내적 / 외적 / 아다마르 곱 (Dot, Cross, Scale) Unity 전체 링크 유니티에서 자주 사용하는 벡터 연산은 내적과 외적이다. 내적의 결과는 스칼라다. (Vector3.Dot) 외적의 결과는 벡터이며, 삼각형의 넓이를 구하는 공식을 참고하자. (Vector3.Cross) 그렇다면 벡터의 각 성분만 곱하는 것은 뭐라고 할까? 행렬에서는 아다마르 곱(Hadamard Product)이라고 한다. 벡터는 1차원 행렬로 볼 수 있다. 두 벡터를 구성 요소별로 곱하기만 하므로 결과는 벡터다. (Multiplies Two Vectors Component-Wise / Element Wise Product) 유니티에서 Vector3.Scale을 이용하면 된다. 생각보다 많이 쓰이지만 함수 이름이 잘 생각 안 나거나 어떻게 표현해야 할지 모르는 경우가 많다. 성분 곱이라.. 2022. 6. 25.
유니티 - 사각형 안에 있는 점 판단하기 (How to Check If a Point Is Inside a Rectangle) Unity 전체 링크 참고 - 삼각형 안에 있는 점 판단하기 - 다각형 안에 있는 점 판단하기 평면에 포함되는 사각형에 점이 포함되어 있는지 알아보자. 아래와 같이 마우스가 향하는 평면이 검은색 라인의 사각형 안에 있다면 오브젝트를 파란색으로, 그렇지 않다면 빨간색으로 변경하도록 해보자. 또한 평면에서 벗어나는 경우에도 마찬가지의 결과를 나타낸다. 먼저 아래의 평면 내부에 사각형을 그리도록 해보자. 평면을 만드는 4개의 점은 각각 A, B, C, D라고 하자. 평면의 중심으로 부터 위를 향하는 선이 deltaZ, 왼쪽을 향하는 선이 deltaX라고 하자. 아래와 같이 drawSquare 함수를 이용해 평면에 그림을 그릴 수 있다. 원하는 너비와 높이를 설정하여 Update에서 호출하면 된다. void d.. 2022. 5. 13.
유니티 - 평면과 직선의 접점 좌표 구하기 (Intersection of a Line and a Plane) Unity 전체 링크 참고 - 세 점을 지나는 평면 구하기 - 3차원에서 두 직선 사이의 최단 거리를 만드는 직선 두 점을 이었을 때, 평면을 통과하는 경우, 접점 좌표(교차점)를 구해보자. 조금 확대하면 아래의 좌표를 구한다고 할 수 있다. 두 점으로 이루어진 직선이 평면을 통과할 때의 접점 좌표의 공식은 아래와 같다. CP = Contact Point, 접점의 좌표 A, B = 두 점의 좌표 nAB = A에서 B를 향하는 직선 방향의 벡터의 normalize Normal = 평면의 노멀 벡터(법선 벡터) P = 평면에 포함된 점 ● 는 벡터의 내적을 의미한다. 빈 오브젝트 ContacPoint를 만들고 ContactPoint.cs를 추가한다. 직선을 만들 두 점 Dot1, 2와 ContactPoint.. 2022. 5. 12.
유니티 - 평면과 점 사이의 최단거리 구하기 (How to Get Shortest Distance between the Plane and the Point) Unity 전체 링크 참고 - 평면과 점 사이의 최단거리를 만드는 평면 위의 점 구하기 - Vector3.Cross로 평면 위에서 시계 방향 판단하기 아래의 그림에서 평면은 (0, 0, 0)에 Sphere는 (0, 3, 2)에 위치하고 있다. 이 평면과 Sphere 사이의 최단거리는 3이 된다. 그러나 두 오브젝트의 거리를 구하면 3이 나오지 않는다. 빈 오브젝트를 생성하여 Distance라고 이름을 변경한 후, DistanceTest.cs를 추가해보자. using System.Collections; using System.Collections.Generic; using UnityEngine; public class DistanceTest : MonoBehaviour { public GameObject .. 2022. 5. 12.
유니티 - 3차원 세 점의 좌표로 삼각형의 넓이 구하기 Unity 전체 링크 참고 - 세 점을 지나는 평면 구하기 - 다각형 좌표의 시계 방향 판단하기, 다각형의 넓이 구하기 세 점의 좌표 Vector3 dot1, dot2, dot3가 주어질 때, Vector3 a = dot2 - dot1; Vector3 b = dot3 - dot1; 이라고 하자. 즉, 이다. 이때, 삼각형의 넓이 Area는 아래와 같다. 유니티의 함수로 구현하면 아래와 같이 구현할 수 있다. float getAreaOfTriangle(Vector3 dot1, Vector3 dot2, Vector3 dot3) { Vector3 a = dot2 - dot1; Vector3 b = dot3 - dot1; float s = (a.y * b.z - b.y * a.z) * (a.y * b.z - b.. 2022. 5. 11.
BOJ 1212, 1373 : 8진수 2진수, 2진수 8진수 알고리즘 문제 전체 링크 https://www.acmicpc.net/problem/1212 https://www.acmicpc.net/problem/1373 8진수 0 ~ 7를 2진수로 변경하면 아래와 같다. 0 → 000 1 → 001 2 → 010 3 → 011 4 → 100 5 → 101 6 → 110 7 → 111 따라서 str8['8진수 문자열 0 ~ 7']이 000 ~ 111이 되도록 memo 해서 출력만 하면 된다. 단, 가장 처음에 나오는 8진수 0 ~ 3의 경우, 앞의 0은 출력하지 않기 때문에 예외 처리를 한다. #include char str[1001000]; int main(void) { char str8['9' + 1][5] = { 0 }; str8['0'][0] = '0'; st.. 2021. 6. 21.
BOJ 1016 : 제곱 ㄴㄴ 수 알고리즘 문제 전체 링크 https://www.acmicpc.net/problem/1016 에라토스테네스의 체와 같은 방법으로 구할 수 있다. 소수의 배수를 모두 지우고 남은 수가 소수가 되는 것처럼 제곱수의 배수를 모두 지우면 제곱 ㄴㄴ 수가 남게 된다. 1,000,000,000,000의 수에 대해 모든 제곱 ㄴㄴ 수를 구할 수 없으므로, MIN ~ MAX (최대 1,000,000 차이)까지만 구하면 된다. 따라서 100만개의 수 중 제곱 ㄴㄴ수를 구분하기 위해 배열을 100만개 잡는다. check[number] = 0 인 경우가 제곱 ㄴㄴ수이다. 이때, MIN번 째 수가 제곱 ㄴㄴ 수 인지 여부는 check 배열의 0번째 index를 본다. int check[1000100]; /* 0 = 제곱 ㄴㄴ .. 2021. 6. 18.
BOJ 11005 : 진법 변환 2 알고리즘 문제 전체 링크 https://www.acmicpc.net/problem/11005 BOJ 2745 : 진법 변환의 역연산이다. 여기서 change 배열은 정수를 문자로 바꾸는 역할을 한다. #include int N, B; char ans[10000]; char change[36]; int main(void) { scanf("%d %d", &N, &B); for (int i = 0; i < 10; i++) change[i] = '0' + i; for (int i = 10; i = 0; i--) printf("%c", change[ans[i]]); putchar('\n'); } return 0; } 2021. 5. 26.
BOJ 2745 : 진법 변환 알고리즘 문제 전체 링크 www.acmicpc.net/problem/2745 B진법의 수 N을 10진법으로 변환하는 문제다. 알파벳이 포함되어 있으므로 문자열로 입력을 받는다. 그리고 각 문자에 대해 change 배열에 정수로 저장한다. for (int i = '0'; i 2021. 5. 8.
반응형