3

所以我在网上找到了这段代码,它做了一个使用随机点的随机贝塞尔曲线。我试图让它非随机,以便它使用静态点我让它只使用 4 个点,这很容易。我以前从未在 python 中使用过 PIL,实际上我正在慢慢学习 python。而且我只做过前端工作(html、javascript、css 等),我只是想知道是否有人可以帮助我。这是我在网上找到的代码:

# Random Bezier Curve using De Casteljau's algorithm
# http://en.wikipedia.org/wiki/Bezier_curve
# http://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm
# FB - 201111244
import random
from PIL import Image, ImageDraw
imgx = 500
imgy = 500
image = Image.new("RGB", (imgx, imgy))
draw = ImageDraw.Draw(image)

def B(coorArr, i, j, t):
    if j == 0:
        return coorArr[i]
    return B(coorArr, i, j - 1, t) * (1 - t) + B(coorArr, i + 1, j - 1, t) * t

n = 4 # number of control points
coorArrX = []
coorArrY = []
for k in range(n):
    x = (0, imgx - 1)
    y = (0, imgy - 1)
    coorArrX.append(x)
    coorArrY.append(y)

# plot the curve
numSteps = 10000    
for k in range(numSteps):
    t = float(k) / (numSteps - 1)
    x = int(B(coorArrX, 0, n - 1, t))
    y = int(B(coorArrY, 0, n - 1, t))
    try:
        image.putpixel((x, y), (0, 255, 0))
    except:
        pass

# plot the control points
cr = 3 # circle radius
for k in range(n):
    x = coorArrX[k]
    y = coorArrY[k]
    try:
        draw.ellipse((x - cr, y - cr, x + cr, y + cr), (255, 0, 0))
    except:
        pass

# image.save("BezierCurve.png", "PNG")
image.show() I add this so I can see it right away

如果有任何帮助都会很棒。

4

2 回答 2

1

好的,开始这一切的详细的 BS 在长线下方。得到的答案在这里。

您的静态点是 x,y 坐标,其中 x 值和 y 值放置在单独的数组中(分别为 coorArrx 和 coorArrY)确保永远不要使用 value = imgx 或 imy。

# Random Bezier Curve using De Casteljau's algorithm
# http://en.wikipedia.org/wiki/Bezier_curve
# http://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm
# FB - 201111244
import random
from PIL import Image, ImageDraw
imgx = 500
imgy = 500
image = Image.new("RGB", (imgx, imgy))
draw = ImageDraw.Draw(image)

def B(coorArr, i, j, t):
    if j == 0:
        return coorArr[i]
    return B(coorArr, i, j - 1, t) * (1 - t) + B(coorArr, i + 1, j - 1, t) * t

# n = random.randint(3, 6) # number of control points
n=4
#coorArrX = []
#coorArrY = []
#for k in range(n):
#    x = random.randint(0, imgx - 1)
#    y = random.randint(0, imgy - 1)
#    coorArrX.append(x)
#    coorArrY.append(y)
coorArrX=[3,129,12,77]
coorArrY=[128,52,12,491]

# plot the curve
numSteps = 10000
for k in range(numSteps):
    t = float(k) / (numSteps - 1)
    x = int(B(coorArrX, 0, n - 1, t))
    y = int(B(coorArrY, 0, n - 1, t))
    try:
        image.putpixel((x, y), (0, 255, 0))
    except:
        pass

# plot the control points
cr = 3 # circle radius
for k in range(n):
    x = coorArrX[k]
    y = coorArrY[k]
    try:
        draw.ellipse((x - cr, y - cr, x + cr, y + cr), (255, 0, 0))
    except:
        pass
image.show()

=.................................................. .........................................= 我对所有人来说也是一个新手对此,我拒绝像您一样查看它……学习经验。

但是当我查看这段代码时,我看到了一些奇怪的东西

for k in range(n):
    x = (0, imgx - 1)
    y = (0, imgy - 1)
    coorArrX.append(x)
    coorArrY.append(y)

你确定这部分是正确的吗?imgx 在其他地方被定义为 500,而 n 是 4。所以这可以读作

for k in range(4):
    x = (0, 500 - 1)
    y = (0, 500 - 1)

其中(因为这些值在此代码中根本不会改变)意味着:

x = (0, 499)
y = (0, 499)

在每一次传球。所以每次他们到达:

coorArrX.append(x)
coorArrY.append(y)

他们只是不断地将相同数据的新副本添加到数组中,所以当它完成时,数组看起来像这样(内部)

[(0, 499), (0, 499), (0, 499), (0,499)]

更令人困惑的是, coorArrX 和 coorArrY 是 A) 相同的,并且 B) 其基本部分相同(即每个元素都是相同的)。因此,当您进入这部分代码时:

# plot the control points
cr = 3 # circle radius
for k in range(n):
    x = coorArrX[k]
    y = coorArrY[k]
    try:
        draw.ellipse((x - cr, y - cr, x + cr, y + cr), (255, 0, 0))
    except:
        pass

并且你替换数组中的值,你得到:

# plot the control points
cr = 3 # circle radius
for k in range(n):
    x = coorArrX[k]
    y = coorArrY[k]
    try:
        draw.ellipse(((0, 499) - 3, (0, 499) - 3, (0, 499) + 3, (0, 499) + 3), (255, 0, 0))
    except:
        pass

现在这是控制绘图曲线段绘制的部分,但我看不出将 elispe 居中在那些不可能的坐标集上如何绘制任何东西?!

分解并进行了复制粘贴测试。 该代码纯粹是伪造的,要么是为了欺骗人们浪费时间,要么是出于同样的原因放置在 OP 发现它的地方。

但是尝试很有趣!

于 2012-12-04T23:34:27.277 回答
0

根据您的描述,唯一的问题似乎与 Python 基础有关。我已经将代码重新排列如下,所以唯一需要触及的东西在底部。现在,如果您想手动指定 4 个控制点,请继续执行(在下面的代码中,我自己指定了其中的 4 个作为示例)。您需要了解,在原始代码中,coorArrX它们coorArrY只是列表,每个包含 4 个点(分别为 x 和 y 坐标)。如果您手动指定它们,则使用循环来编写它们是没有意义的。我希望这段代码足够清楚:

# Random Bezier Curve using De Casteljau's algorithm
# http://en.wikipedia.org/wiki/Bezier_curve
# http://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm
# FB - 201111244
from PIL import Image, ImageDraw

def plot_curve(image, px, py, steps=1000, color=(0, 255, 0)):
    def B(coord, i, j, t):
        if j == 0:
            return coord[i]
        return (B(coord, i, j - 1, t) * (1 - t) +
                B(coord, i + 1, j - 1, t) * t)

    img = image.load()
    for k in range(steps):
        t = float(k) / (steps - 1)
        x = int(B(px, 0, n - 1, t))
        y = int(B(py, 0, n - 1, t))
        try:
            img[x, y] = color
        except IndexError:
            pass

def plot_control_points(image, px, py, radi=3, color=(255, 0, 0)):
    draw = ImageDraw.Draw(image)
    for x, y in zip(px, py):
        draw.ellipse((x - radi, y - radi, x + radi, y + radi), color)


# Your fixed, manually specified, points.
n = 4
coord_x = [25, 220, 430, 410]
coord_y = [250, 10, 450, 40]

image = Image.new("RGB", (500, 500))

plot_curve(image, coord_x, coord_y)
plot_control_points(image, coord_x, coord_y)

image.save("BezierCurve.png")
于 2012-12-10T01:10:21.967 回答