Proof of well-known 'Intersection Of Three Planes' formula.

Introduction & Motivation Recently, I found out well-known formula 'Intersection between Three Planes'  (Equation (22.31) of [1]) has no proof on literaly anywhere. Even (almost) the book where it is propsed[2]. So, I decided to figure out how this formula is derived.. (of course, experimentally it is wokrs very well.) Notation Let there be three planes on euclidean space $P_1, P_2, P_3$ which intersect in a point. If we let there normals as $n_1=(a_1, b_1, c_1), n_2=(a_2, b_2, c_2), n_3=(a_3, b_3, c_3)$, they must be linearly independent. Also, let the planes $P_1, P_2, P_3$ as the system of equation like below :  $$\begin{cases} a_1x+b_1y+c_1z+d_1=0 \\ a_2x+b_2y+c_2z+d_2=0 \\ a_3x+b_3y+c_3z +d_3=0 \end{cases}$$ Proof A. Solve problem with Linear Algebra. To find a intersection point by linear algebra, write system of equations as matrix form : $$\begin{bmatrix}a_1 & b_1 & c_1 \\ a_2 & b_2 & c_2 \\ a_3 & b_3 & c_3 \\ \end{bmatrix}\begin{bmatrix} x

Copy OpenGL buffer content into host memory.

glGetNamedBufferSubData(VBO, 0,3 * 10 * sizeof(float),  bufferpointer); glGetNamedBufferSubData(EBO, 0, 3 * 10 * sizeof(unsigned int), bufferpointer);

Measuring execution time with C++ (>= 11) standard library

(recent change : 2021-08-14) Test Environment :  Windows 10 21H1 / MSVC C++ 14 Introduction What chrono(C++ >= 11) makes better than time.h(C) ? - More functionality - More precise - More convenient. Clock Types in Chrono As I know, chrono only provides three types of clock which originated from boost library. Different type of clocks is implement in chrono of boost . The clock types included in chrono are :  (a) system_clock : (may not be monotonic) system-wide real time wall clock.     - Could be adjusted at any time by the OS. (e.g. NTP sync. or user's action)     - Based on UTC time-zone. (b)  steady_clock : (monotonic) time between ticks are constant, not related with system_clock's time,  every time point increases monotonically. (c)  high_resolution_clock  : (may be an alias of above) clock with smallest tick period. You may already see other articles, that measuring accurate, high resolution time using OS-dependent (e.g.  QueryPerformanceCounter ) timer. But actu

'Index type not supported yet' error when doing QR factorization using Eigen and SuiteSparseQR

이미지
Environment Windows 10 21H1 / MSVC C++ 14 / eigen 3.3.7 / suitesparse  5.3.0 Error Specification Assertion failed: false && "Index type not supported yet", file C:\vcpkg\installed\x64-windows\include\eigen3\Eigen\src/CholmodSupport/CholmodSupport.h, line 93 Solution Just comment eigen_assert on line 93 of CholmodSupport.h. Test Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include <Eigen/Sparse> #include <Eigen/SPQRSupport> #include <Eigen/SparseCholesky> #include <Eigen/OrderingMethods> #include <vector> #include <iostream> typedef Eigen :: SparseMatrix < double > SparseColMat; int main ( int argc, char ** argv) { SparseColMat m( 4 , 3 ); m.coeffRef( 0 , 0 ) = -1 ; m.coeffRef( 0 , 1 ) = -1 ; m.coeffRef( 0 , 2 ) = 1 ; m.coeffRef( 1 , 0 ) = 1 ; m.coeffRef( 1 , 1 ) = 3 ; m.coeffRef( 1 , 2 ) = 3 ; m.coeffRef( 2 , 0 ) = -1 ; m.coeffRef( 2 , 1 ) =

[요리 실험] CJ 고메 베이커리 크로와상

이미지
서론 에어프라이어와 오븐이 같이 되는 멋진 주방 기기(SK 매직 EON-C200F)를 처음으로 구매했다. 그래서 기념으로 냉동 식품을 몇 가지 사 보았는데, 그 중 하나가 바로 아래 제품이다. [문제의 그 제품] 인터넷 상의 다른 후기들을 보면 제조사가 권장하는 대로 냉동 상태의 생지를 바로 조리해서 맛있게 먹었다고 한다. 그런데 나는 결과가 처참했다. 예상했던 것보다 크기도 작고 안 익은 밀가루 반죽 맛이 났다(충격을 받아서 한번에 먹어 치우느라 사진은 못 찍었다).  실험 충격을 받은 나는 검색을 통해 실온에서 생지를 숙성 해야 한다는 이야기를 주워듣게 되었다. 남은 생지를 이렇게 맛없게 먹을 수는 없기에 속는셈 치고 실험을 해 보았다. (참고로 사진은 iPhone X 기본 카메라앱을 이용해서 2배율로 세로 모드로 찍었고, 원형 스테인리스 망이 짧은 축에 가득 차도록 찍어서 대충 동일한 조건의 사진을 찍으려고 노력했다.) 1. ( 2021-07-11)  아래 그림은 약 28 °C ~ 30 °C를 넘나드는 우리 집의 부엌에서 냉동 생지를 종이 호일위에 올리고, 아무것도 덮지 않은 채로 약 3시간 30분 정도 내버려 둔 결과이다. 빨간 점선이 냉동실에서 바로 꺼낸 생지이고, 노란 점선이 숙성된 생지이다. 확실히 부피나 질감에서 확연히 차이가 난다. 그리고 원래 제조사 조리법 중 하나대로 ' 에어프라이어 모드   180도 3분 예열/15분 조리' 를 했는데 오른쪽 그림처럼 위쪽이 검게 그을려 버렸다. 아마도 이 조리법은 냉동생지 기준인가보다. 그래도 안쪽은 안타고 숙성 안 했을 때보다는 잘 익었다(그래도 뭔가 덜 익은 듯한 비주얼이긴 한데......)   [숙성 결과] [조리 결과] [이빨로 깨물어 본 단면] 첨언 다른 세팅으로 또 해 먹어보고 추가하겠음.

Fast data visualization using Paraview compiled with MPI.

이미지
Test Environment ParaView 5.8.1 MPI version Windows 10 Windows MPI 10.0 How to do it? Make sure that bin directory under paraview installation directory is included in PATH variable, to make everything easy. Then, type command below on windows terminal. (cmd, powershell, etc...) Note that, default connection URL will be localhost:11111. mpiexec -cores [# of threads] pvserver 

Optimal Linear Transformation

In shape matching problem between 3D point sets , Optimal Linear Transformation  between point sets plays an important role. I'll follow notations in [1] as far as I can. Problem Let there be two 3D point sets, $p_i = [x_i, y_i, z_i]^t, p^{'}_i = [x^{'}_i, y^{'}_i, z^{'}_i]^t, i= 1,2,\cdots, N$. We want to find matrix $X$ that minimizes $$ \begin{align} \sum_{i = 1}^{N} \| p^{'}_i - Xp_i \|^2 = \sum_{i = 1}^{N} \{ \| p^{'}_i \|^2 - 2 p^{'}_i \cdot (X p_i) + \| Xp_i \|^2 \} \tag{1} \\ \end{align} $$ Solution We can easily find minimum of (1) by completing the square. First, from the fact that for some arbitrary column vector $k$, $ \| k \|^2 = k \cdot k  = tr(kk^T) $, (1) can be rewritten as (2), $$ \begin{align} \sum_{i = 1}^{N} tr( p^{'}_i (p^{'}_i)^T - 2 p^{'}_i (p_i)^T X^T + Xp_i (p_i)^T X^T ) = tr(A_{p^{'}} - 2MX^T + XA_p X^T ) \tag{2} \\ \end{align} $$ where sum of outer products is defined as follows : $$ A_p