Objective c 将缩放和平移变换应用于UIBezierPath

Objective c 将缩放和平移变换应用于UIBezierPath,objective-c,uibezierpath,affinetransform,Objective C,Uibezierpath,Affinetransform,我有一个UIBezierPath,我想: 移动到UIView上的任意坐标 变大或变小 我正在根据预定义坐标列表绘制UIBezierPath。我实现了以下代码: CGAffineTransform move = CGAffineTransformMakeTranslation(0, 0); CGAffineTransform moveAndScale = CGAffineTransformScale(move, 1.0f, 1.0f); [shape applyTransform:moveA

我有一个UIBezierPath,我想:

  • 移动到UIView上的任意坐标
  • 变大或变小
我正在根据预定义坐标列表绘制UIBezierPath。我实现了以下代码:

CGAffineTransform move = CGAffineTransformMakeTranslation(0, 0);

CGAffineTransform moveAndScale = CGAffineTransformScale(move, 1.0f, 1.0f);
[shape applyTransform:moveAndScale];
[shape moveToPoint:CGPointMake(0, 0)];  
我也尝试过缩放,然后移动形状,似乎没有什么不同

使用此代码:

CGAffineTransform move = CGAffineTransformMakeTranslation(0, 0);

CGAffineTransform moveAndScale = CGAffineTransformScale(move, 1.0f, 1.0f);
[shape applyTransform:moveAndScale];
[shape moveToPoint:CGPointMake(0, 0)];  
我开始在(0,0)处绘制形状,但实际情况就是这样。我假设这是因为正在从0,0到列表中的下一个点绘制一条线

当我将移动变换设置为(0,0)时,这就是它绘制的位置。这里,moveToPoint设置为列表中的第一个坐标对。正如你所看到的,它不是在0,0

最后,增加1.0f会将形状完全移出屏幕,无论我告诉形状移动到哪里


有人能帮我理解为什么形状不是在0,0处绘制的,以及为什么当我缩放它时它会离开屏幕

您需要注意应用变换的顺序,您应该考虑将变换连接在一起,并一次性应用它们

顺序很重要,因为每个变换都会影响路径中的所有x、y位置。因此,翻译受尺度的影响。颠倒顺序,路径将缩放然后移动

此外,坐标系也很重要,尤其是在缩放时。确保围绕0,0绘制,然后缩放,然后平移。这是最容易的,如果你正常化的点。对lat/long值进行归一化意味着将纬度除以90,将经度除以180(这实际上会给出一个范围-1..1)。执行此操作时,应首先缩放路径,然后将其平移到视图的中心,然后应用所需的平移。

(根据OP在上述注释中的要求)


我在这一点上可能是错的,但这不是代码吗

CGAffineTransformMakeTranslation(0, 0);
就说东西应该沿x轴移动0个像素,沿y轴移动0个像素?()它实际上不会将任何东西移动到origo(0,0),就像您试图做的那样

另外,您似乎对如何正确使用
moveToPoint:
有点误解。。可以将其视为移动光标的一种方式,但实际上不绘制任何内容。这只是一种表达“我想从现在开始画画”的方式。绘图本身可以通过其他方法执行。如果你想画一个边长为L的正方形,你可以这样做

// 'shape' is a UIBezierPath
NSInteger L = 100;
CGPoint origin = CGPointMake(50, 50);
[shape moveToPoint:origin]; // Initial point to draw from
[shape addLineToPoint:CGPointMake(origin.x+L, origin.y)]; // Draw from origin to the right
[shape addLineToPoint:CGPointMake(origin.x+L, origin.y+L)]; // Draw a vertical line
[shape addLineToPoint:CGPointMake(origin.x, origin.y+L)]; // Draw bottom line
[shape addLineToPoint:origin]; // Draw vertical line back to origin

请注意,这段代码根本没有经过测试,但它应该让您了解如何使用
moveToPoint:
addLineToPoint:

请参阅我对该问题所做的编辑。他们应该澄清我的问题。道路上有哪些点,以及你如何添加它们。这些点可能都应该在0和1之间标准化,这样你就可以合理地缩放和定位这条线。它们实际上是经度和纬度点,我将它们转换为十进制,然后缩小以适应UIView。我通过迭代一组点来添加它们,然后将它们添加到UIBezierPath,如下所示:[shape addLineToPoint:CGPointMake(p.x,p.y)];我如何规范化一个点?@Wain,在使用
cGraffinetTransform
s进行缩放后,如何将其转换到视图的中心?我在这一点上可能错了,但这不是代码(
cGraffinetTransformMakeTransform(0,0);
)就说东西应该沿x轴移动0个像素,沿y轴移动0个像素?()它实际上不会将任何东西移动到origo(0,0),就像您试图做的那样。此外,您似乎也在使用
moveToPoint:
错误..您是对的!考虑到这一点,我改变了数字,它的规模,我现在可以看到它。但是,我如何错误地使用moveToPoint?你应该把它贴出来作为答案。