flutter 如何使用Matrix4转换坐标

ovfsdjhp  于 2022-12-24  发布在  Flutter
关注(0)|答案(1)|浏览(211)

我正在使用图像库/imglib中的copyRectify。这个库不支持路径。但是,我可以通过指定topleft、topright、bottomleft、bottomright的点来复制图像的一部分。
例如:

imagePiece = imglib.copyRectify(imagSrc, 
        topLeft: imglib.Point(0,0), 
        topRight: imglib.Point(10,0), 
        bottomLeft: imglib.Point(0,100), 
        bottomRight: imglib.Point(10,100),
         )

我想通过Matrix4旋转或平移来操作这些点值。我可以将这些点值集合放入什么结构中,以便能够应用. transform和. translate等Matrix4操作,然后将新值应用到copyRectify?我不想手动更新每个点,我认为有一些更干净的方法来完成此操作,如以下伪代码:

// put the point values into a theoretical list that Matrix4 can work with
pointlist = [0,0, 10,0, 0,100, 10,100];

// make new matrix
matrix = Matrix(1,1,1,1); 

// rotate the matrix 
matrix.rotateDegrees(45);

// apply the matrix values to the points in the list and return an updated list
rotatedList = matrix.apply(pointlist); 

// used the new rotated list values in copyRectify
...

一旦我能把这些点放到一个合适的结构中,这个结构可以被矩阵操纵,那么剩下的就都到位了。

beq87vna

beq87vna1#

也许你可以用这个作为起点。我使用了vector_math库中的Vector和Matrix4。我为矩形中的每个点使用了4个矢量,并对每个点应用了Matrix4转换矩阵。我不确定这是否正确,但它确实添加了旋转,但不是我预期的方式。它旋转了整个复制的图像,而不仅仅是旋转选区。

// initialize integers for initial points 
 // x2 is width ; y2 is height
 x1=0; y0=y; x2=100; y2=100;

// create 4 points of a rectangle for topLeft to bottomRight
  imglib.Point p1 = imglib.Point(x1, y1);
  imglib.Point p2 = imglib.Point(x2, y1);
  imglib.Point p3 = imglib.Point(x1, y2); 
  imglib.Point p4 = imglib.Point(x2, y2);

// put the 4 points in 4 vectors
  vector_math.Vector3 v1 = vector_math.Vector3(x1.toDouble() , y1.toDouble(), 1);
  vector_math.Vector3 v2 = vector_math.Vector3(x2.toDouble() , y1.toDouble(), 1);
  vector_math.Vector3 v3 = vector_math.Vector3(x1.toDouble() , y2.toDouble(), 1);
  vector_math.Vector3 v4 = vector_math.Vector3(x2.toDouble() , y2.toDouble(), 1);

// Create a matrix4, rotate it and apply it to all 4 points/vectors
 vector_math.Matrix4  T = vector_math.Matrix4.rotationZ(vector_math.radians(45));  
  v1 = T.transform3(v1);
  v2 = T.transform3(v2);
  v3 = T.transform3(v3);
  v4 = T.transform3(v4); 

// pull the new rotated point values out of the vectors: 
  p1.x = v1[0];
  p1.y =v1[1];
  p2.x = v2[0];
  p2.y =v2[1];
  p3.x = v3[0];
  p3.y =v3[1];
  p4.x = v4[0];
  p4.y =v4[1];

// copyRectify the source image with transformed points
imglib.Image angledSlice = imglib.copyRectify(
        srcImage, 
        topLeft: p1, 
        topRight: p2, 
        bottomLeft: p3, 
        bottomRight: p4,
         );

相关问题