我正在尝试创建一个"平行"贝塞尔曲线.在我的尝试中,我已经接近但没有雪茄.我试图在2条曲线(红色,蓝色)之间保持稳定的1px偏移.
我的主要目标是使用边缘偏离algorythm来扩展/缩小svg路径.
解
对于正在寻找解决方案的其他人,我创建了一个AS3版本.
http://seant23.wordpress.com/2010/11/12/offset-bezier-curves/
下图说明了我要实现的目标:
http://i53.tinypic.com/14ugfpd.png
基本上我想创建两个Path
彼此"接触"的对象(并行路径).这是用于生成此图像的XAML:
<StackPanel Orientation="Horizontal">
<StackPanel.LayoutTransform>
<ScaleTransform CenterX="0" CenterY="0" ScaleX="15" ScaleY="15" />
</StackPanel.LayoutTransform>
<Grid Margin="-5,0,0,0">
<Path Stroke="Blue">
<Path.Data>
<PathGeometry>M10,10 C20,10 10,20 20,20</PathGeometry>
</Path.Data>
</Path>
<Path Stroke="Red">
<Path.Data>
<PathGeometry>M10,11 C19,10.85 9,20.80 20,21</PathGeometry>
</Path.Data>
</Path>
</Grid>
<Grid Margin="-5,0,0,0">
<Path Stroke="Blue">
<Path.Data>
<PathGeometry>M10,10 C20,10 10,20 20,20</PathGeometry>
</Path.Data>
</Path>
<Path Stroke="Red">
<Path.Data>
<PathGeometry>M10,11 C19,11 9,21 20,21</PathGeometry>
</Path.Data>
</Path>
</Grid>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
第一条曲线具有手动优化的点位置,第二条曲线具有通过考虑行程厚度而容易计算的点位置.你可以看到第二条曲线并不完美,因为两者之间有一个空间.如何以编程方式创建两条完美的"触摸"曲线,而无需手动优化每条曲线(实际上这是不可能的,因为曲线是在代码中生成的)?
简单地说,我Path
在代码中生成一条曲线(resp.),我需要它有两种颜色.所以我认为制作第二个并行Path
可以做到这一点,但调整Geometry
第二个Path
(使它并行)已被证明是有问题的.
平行的直线和曲线由查尔斯Petzold的可能是解决这个问题的方法之一.它实际上工作得很好,但它会使曲线变平,这会在深度缩放时产生视觉效果,当然还有性能缺陷.
然而,该算法不会尝试找到与另一个贝塞尔曲线平行的贝塞尔曲线.该算法完全基于折线:输入是一条或多条折线,输出由每条输入折线的多条折线组成.因此,ParallelPath需要"展平"输入几何体 - 这意味着将整个几何体(包括圆弧和贝塞尔曲线)转换为折线近似.
所以我的一个朋友(数学博士感受器)已经分析了这个问题并且创建(三阶) …
我有一个点列表.例如,points = [[160, 75], [115, 567]]
.
如何在PyQt4中绘制一条线,所以它会是这样的:
提前致谢.
编辑:为了记录,我正在尝试实现Bezier曲线,所以它看起来像这样:
这是我目前的代码:
from PyQt4.QtGui import QWidget, QPolygonF, QPainter, QPen, QBrush, QColor, \
QApplication, QIcon, QVBoxLayout, QSlider, QHBoxLayout, QPushButton, QLCDNumber
from PyQt4.QtCore import QObject, SIGNAL, SLOT, QPointF, Qt, QRectF, QPointF
import time, sys
#================================================================
# For the next block I used this post
# http://stackoverflow.com/a/3220819/736306,
# but I wish to replace it with self.liniar_bez(),
# biliniar_bez(), self.cubic_bez() and self.fourG_bez()
# because I want to control 't' with self.slider
def avg(a, …
Run Code Online (Sandbox Code Playgroud)