Transform rhombus defined by corners to another rhombus - graphics

If you have a 2D model in the shape of a rhombus, defined by it's four corners, and you want to transform it into the shape of another rhombus, given it's 4 corners, how would you do this? Can you do it with a transformation matrix?
My line of thinking is that you can find 4 vectors along the sides such that ||b||/||side_b|| = ||c||/||side_c||, ||a||/||side_a|| = ||b||/||side_b||, such that (a,b) and (b,c) cross at p.
a
-------->-------
| |
b ^ p ^ c
| |
| |
-------->-------
b
However, I would like the most efficient way possible.

So a rhombus can be defined by 2 vectors; scaling on the X axis, and scaling on the y axis. So a matrix that scales a square (we'll say 1x1 dimensions) into a rhombus would look like this: (sorry for the gross matrices! underscores are for spacing)
|X1_1 Y1_1 ___0|
|X1_2 Y1_2 ___0| = Matrix A
|___0 ___0 ___1|
and we want to go from this toward some new dimensions, represented as the following:
|X2_1 Y2_1 ___0|
|X2_2 Y2_2 ___0| = Matrix B
|___0 ___0 ___1|
We want to transform Matrix A into Matrix B. I'll name this transformation T. Therefore:
Matrix A * Transform T = Matrix B.
Doing some basic matrix shuffling, and...
Transform T = Matrix B * inverse(matrix A).
So just fill Matrix B with the dimensions you want, and fill Matrix A with the values you start with.

Related

How to find if a 3d point is inside the same surface as a 3d triangle

Imagine that we have a triangle where each point is represented using 3 coordinates. How can we tell if a point, which is also represented using 3 coordinates, isn't inside the triangle, but is on the same surface as the triangle ?
Having triangle points A, B, C, we can build vectors
AB = B - A
AC = C - A
and normal vector N using cross product
N = AB x AC
To check whether point P belongs to ABC plane, calculate dot product
AP = P - A
dp = AP.dot.N
dp is equal to zero for points in the plane (use some tolerance to compensate numerical errors)
To find whether point is outside triangle:
choose any non-zero component of normal N (say z-component)
calculate only this component of cross-product of
AB x AP (here we need only (AB.x*AP.y-AB.y*AP.x) to get z-component of result)
BC x BP
CA x CP
If all signs of results are equal (positive or negative) - P is inside, if signs differ - P is outside.
Basically if the points distance to the plane is zero.
Here is my first google hit https://mathinsight.org/distance_point_plane

Deriving a matrix values from another 2 matrices

Suppose you have Matrix A.
Suppose also that we have Matrix C
If we have A = B x C and we want to find out the B matrix values which I believe should be 3x3 (Correct me if I am wrong)
Do we need to use matrix inversion here? I did not use algebra since many years.
I do not have a code yet but if someone can provide a snippet that will be great.
This is a problem that I have in image processing where the A , C hold RGB values.
The submitted matrices are just for illustration.
I am trying to solve this problem using Python numpy
I hope that someone can help with it.
Your matrix should be 5x5. As we are dealing with non-square matrices, you could use the generalized inverse of C to obtain B:
import numpy as np
np.random.seed(10)
A = np.random.randint(0,9,(5,3))
C = np.random.randint(0,9,(5,3))
B = np.matmul(A,np.linalg.pinv(C))
print B
Building on percusse's comment, you can do this with numpy.linalg.lstsq. However, this assumes that we are performing matrix left division but the situation is your question is for right division.
Using the fact that you are solving for B with B = A / C, lstsq solves problems of the type A \ C. To convert this into a form for lstsq, we can convert it into the latter problem by:
B = A / C = (C' \ A')'
The ' operator is the transpose. The above is found by linear algebra rules. Specifically, perform two transposes: ((A / C)')' where transposing a matrix twice is simply the result of itself. Also, knowing that (AC)' is equal to C'A' and for a matrix, the inverse of the transpose is equal to the transpose of the inverse you should get the above relationship.
Therefore:
B = numpy.linalg.lstsq(C.T, A.T)[0].T
The output of lstsq is a tuple where the first element is the actual solution.
Take note that for your particular example, C is a rank-deficient matrix so you won't be able to reconstruct A properly from B and C.

Calculate circle packing

I need to mathematically calculate the position [x, y] and the radius where C ∈ N and C is a circle that can be positioned inside another circle with scalable radius and being traversed until reaching a leaf.
Being x the horizontal scale, y the vertical scale and r the radius, I need to infinetely position subcircles inside it, in a perfect geometric form. I've made some math proofs to calculate the density, but I'm not having good results: https://gist.github.com/haskellcamargo/89384ac17ba0131115c7
I define Circle as:
data Shape = Circle Double Double Double deriving (Show)
But I cannot find a deterministic way to prove the x and y position when a circle is inserted inside, with a perfect geometric form.
I found ways to calculate the density of a subcircle, but with special calcs according to the amount of subcircles, but the x and y are variant, with the unique warranty that the composed form where n > 3 will be composed by triangles. I know that I must work on angle, but I'm stuck on this in the last 2 weeks.
The question is: Can I use deterministic calculations to have the position x, y and the radius giving n, being n the number of elements? The final result would be like http://bl.ocks.org/mbostock/7607535, but with the absolute position, as calculated by D3.

About affine transform (translation )

For affine 4*4 transformation, I saw two representation in different text
one is
L T
0 1
Another is
L 0
T 1
L is the linear part, T is the translation part; I am wondering which is correct?
Both forms are correct. The first is used in left-multiply matrix by column vector
ResultVector = Matrix*V (for example, in OpenGL), and the second - in right-multiply convention with row vector V*Matrix (for example, in DirectX)

How can I find the 3D coordinates of a projected rectangle?

I have the following problem which is mainly algorithmic.
Let ABCD be a rectangle with known dimensions d1, d2 lying somewhere in space.
The rectangle ABCD is projected on a plane P (forming in the general case a trapezium KLMN). I know the projection matrix H.
I can also find the 2D coordinates of the trapezium edge points K,L,M,N.
The Question is the following :
Given the Projection Matrix H, The coordinates of the edges on the trapezium and the knowledge that our object is a rectangle with specified geometry (dimensions d1, d2), could we calculate the 3D coordinates of the points A, B, C, D ?
I am grabbing images of simple rectangles with a single camera and i want to reconstruct the rectangles on space. I could grab more than one image and use triangulation but this is not desired.
The projection Matrix alone isn't enough since a ray is projected to the same point. The fact that the object has known dimensions, makes me believe that the problem is solvable and there are finite solutions.
If I figure out how this reconstruction can be made I know how to program it. So I am asking for an algorithmic/math answer.
Any ideas are welcome
Thanks
You need to calculate the inverse of your projection matrix. (your matrix cannot be singular)
I'm going to give a fairly brief answer here, but I think you'll get my general drift. I'm assuming you have a 3x4 projection matrix (P), so you should be able to get the camera centre by finding the right null vector of P: call it C.
Once you have C, you'll be able to compute rays with the same direction as vectors CK,CL,CM and CN (i.e. the cross product of C and K,L,M or N, e.g. CxK)
Now all you have to do is compute 3 points (u1,u2,u3) which satisfies the following 6 constraints (arbitrarily assuming KL and KN are adjacent and ||KL|| >= ||KN|| if d1 >= d2):
u1 lies on CK, i.e. u1.CK = 0
u2 lies on CL
u3 lies on CN
||u1-u2|| = d1
||u1-u3|| = d2
(u1xu2).(u1xu3) = 0 (orthogonality)
where, A.B = dot product of vectors A and B
||A|| = euclidean norm of A
AxB = cross product of A and B
I think this problem will generate a set of possible solutions, at least in 2D it does. For the 2D case:
|
-----------+-----------
/|\
/ | \
/ | \
/---+---\VP
/ | \
/ | \
/ | \
/ | \
/ | -- \
/ | | \
/ | | \
In the above diagram, the vertical segment and the horizontal segment would project to the same line on the view plane (VP). If you drew this out to scale you'd see that there are two rays from the eye passing through each end point of the unprojected line. This line can be in many positions and rotations - imagine dropping a stick into a cone, it can get stuck in any number of positions.
So, in 2D space there are an infinite number of solutions within a well defined set.
Does this apply to 3D?
The algorithm would be along the lines of:
Invert the projection matrix
Calculate the four rays that pass through the vertices of the rectangle, effectively creating a skewed pyramid
Try and fit your rectangle into the pyramid. This is the tricky bit and I'm trying to mentally visualise rectangles in pyramids to see if they can fit in more than one way.
EDIT: If you knew the distance to the object it would become trivial.
EDIT V2:
OK, let Rn be the four rays in world space, i.e. transformed via the inverse matrix, expressed in terms of m.Rn, where |Rn| is one. The four points of the rectange are therefore:
P1 = aR1
P2 = bR2
P3 = cR3
P4 = dR4
where P1..P4 are the points around the circumference of the rectangle. From this, using a bit of vector maths, we can derive four equations:
|aR1 - bR2| = d1
|cR3 - dR4| = d1
|aR1 - cR3| = d2
|bR2 - dR4| = d2
where d1 and d2 are the lengths of the sides of the rectangle and a, b, c and d are the unknowns.
Now, there may be no solution to the above in which case you'd need to swap d1 with d2. You can expand each line to:
(a.R1x - b.R2x)2 + (a.R1y - b.R2y)2 + (a.R1z - b.R2z)2 = d12
where R1? and R2? are the x/y/z components of rays 1 and 2. Note that you're solving for a and b in the above, not x,y,z.
m_oLogin is right. If I understand your goal, the image the camera snaps is the plane P, right? If so, you're measuring K,L,M,N off the 2D image. You need the inverse of the projection matrix to reconstruct A,B,C, and D.
Now I've never done this before, but it ocurrs to me that you might run into the same problem GPS does with only 3 satellite fixes - there are two possible solutions, one 'behind' P and one 'in front' of it, right?
The projection matrix encapsulates both the perspective and scale, so the inverse will give you the solution you are after. I think you are assuming that it only encapsulates the perspective, and you need something else to choose the correct scale.

Resources