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 値が別々の配列 (それぞれ coorArrx と coorArrY) に配置された x,y 座標であり、値 = 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

これは、プロットの曲線セグメントの描画を制御する部分ですが、それらの不可能な座標セットにエリスペを中心に配置すると、何かを描画できることがわかりません!

壊れて、コピーペーストのテストを実行しました。 このコードは純粋に偽物であり、人々をだまして時間を無駄にするために配置されているか、同じ理由で 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 に答える