1
0
mirror of https://github.com/Pomax/BezierInfo-2.git synced 2025-09-02 12:54:23 +02:00

update drawCurve to drawCurvePoint to better reflect what it does

This commit is contained in:
Pomax
2021-08-30 07:44:49 -07:00
parent 316d82b107
commit 0bc057e811
6 changed files with 20 additions and 20 deletions

View File

@@ -26,20 +26,20 @@
いま説明したアルゴリズムを実装すると、以下のようになります。 いま説明したアルゴリズムを実装すると、以下のようになります。
``` ```
function drawCurve(points[], t): function drawCurvePoint(points[], t):
if(points.length==1): if(points.length==1):
draw(points[0]) draw(points[0])
else: else:
newpoints=array(points.size-1) newpoints=array(points.size-1)
for(i=0; i<newpoints.length; i++): for(i=0; i<newpoints.length; i++):
newpoints[i] = (1-t) * points[i] + t * points[i+1] newpoints[i] = (1-t) * points[i] + t * points[i+1]
drawCurve(newpoints, t) drawCurvePoint(newpoints, t)
``` ```
これで実装完了です。ただし、+演算子のオーバーロードなどという贅沢品はたいてい無いでしょうから、`x``y`の値を直接扱う場合のコードも示しておきます。 これで実装完了です。ただし、+演算子のオーバーロードなどという贅沢品はたいてい無いでしょうから、`x``y`の値を直接扱う場合のコードも示しておきます。
``` ```
function drawCurve(points[], t): function drawCurvePoint(points[], t):
if(points.length==1): if(points.length==1):
draw(points[0]) draw(points[0])
else: else:
@@ -48,7 +48,7 @@ function drawCurve(points[], t):
x = (1-t) * points[i].x + t * points[i+1].x x = (1-t) * points[i].x + t * points[i+1].x
y = (1-t) * points[i].y + t * points[i+1].y y = (1-t) * points[i].y + t * points[i+1].y
newpoints[i] = new point(x,y) newpoints[i] = new point(x,y)
drawCurve(newpoints, t) drawCurvePoint(newpoints, t)
``` ```
さて、これは何をしているのでしょう関数に渡す点のリストが長さ1であれば、点を1つ描きます。それ以外であれば、比率<i>t</i>の位置の点(すなわち、さきほどの説明に出てきた「印」)のリストを作り、そしてこの新しいリストを引数にして関数を呼び出します。 さて、これは何をしているのでしょう関数に渡す点のリストが長さ1であれば、点を1つ描きます。それ以外であれば、比率<i>t</i>の位置の点(すなわち、さきほどの説明に出てきた「印」)のリストを作り、そしてこの新しいリストを引数にして関数を呼び出します。

View File

@@ -24,20 +24,20 @@
Запишем согласно предложенному алгоритму: Запишем согласно предложенному алгоритму:
``` ```
function drawCurve(points[], t): function drawCurvePoint(points[], t):
if(points.length==1): if(points.length==1):
draw(points[0]) draw(points[0])
else: else:
newpoints=array(points.size-1) newpoints=array(points.size-1)
for(i=0; i<newpoints.length; i++): for(i=0; i<newpoints.length; i++):
newpoints[i] = (1-t) * points[i] + t * points[i+1] newpoints[i] = (1-t) * points[i] + t * points[i+1]
drawCurve(newpoints, t) drawCurvePoint(newpoints, t)
``` ```
Готово, алгоритм воплощен. Помимо того факта, что зачастую мы не располагаем роскошью перенагрузки оператора "+", так давайте совместим вычисление для значений `x` и `y`: Готово, алгоритм воплощен. Помимо того факта, что зачастую мы не располагаем роскошью перенагрузки оператора "+", так давайте совместим вычисление для значений `x` и `y`:
``` ```
function drawCurve(points[], t): function drawCurvePoint(points[], t):
if(points.length==1): if(points.length==1):
draw(points[0]) draw(points[0])
else: else:
@@ -46,7 +46,7 @@ function drawCurve(points[], t):
x = (1-t) * points[i].x + t * points[i+1].x x = (1-t) * points[i].x + t * points[i+1].x
y = (1-t) * points[i].y + t * points[i+1].y y = (1-t) * points[i].y + t * points[i+1].y
newpoints[i] = new point(x,y) newpoints[i] = new point(x,y)
drawCurve(newpoints, t) drawCurvePoint(newpoints, t)
``` ```
И что это делает? Это зарисует точку на график, если длинна вводной points составляет всего одну точку. В противном случае — это создает новый список для вводной, составленный из "маркеров", обчисленых пропорционально значению <i>t</i> между поточного списка точек вводной и вызовет саму себя с новой вводной. И что это делает? Это зарисует точку на график, если длинна вводной points составляет всего одну точку. В противном случае — это создает новый список для вводной, составленный из "маркеров", обчисленых пропорционально значению <i>t</i> между поточного списка точек вводной и вызовет саму себя с новой вводной.

View File

@@ -26,20 +26,20 @@
让我们使用刚才描述过的算法,并实现它: 让我们使用刚才描述过的算法,并实现它:
``` ```
function drawCurve(points[], t): function drawCurvePoint(points[], t):
if(points.length==1): if(points.length==1):
draw(points[0]) draw(points[0])
else: else:
newpoints=array(points.size-1) newpoints=array(points.size-1)
for(i=0; i<newpoints.length; i++): for(i=0; i<newpoints.length; i++):
newpoints[i] = (1-t) * points[i] + t * points[i+1] newpoints[i] = (1-t) * points[i] + t * points[i+1]
drawCurve(newpoints, t) drawCurvePoint(newpoints, t)
``` ```
好了,这就是算法的实现。一般来说你不能随意重载“+”操作符,因此我们给出计算`x``y`坐标的实现: 好了,这就是算法的实现。一般来说你不能随意重载“+”操作符,因此我们给出计算`x``y`坐标的实现:
``` ```
function drawCurve(points[], t): function drawCurvePoint(points[], t):
if(points.length==1): if(points.length==1):
draw(points[0]) draw(points[0])
else: else:
@@ -48,7 +48,7 @@ function drawCurve(points[], t):
x = (1-t) * points[i].x + t * points[i+1].x x = (1-t) * points[i].x + t * points[i+1].x
y = (1-t) * points[i].y + t * points[i+1].y y = (1-t) * points[i].y + t * points[i+1].y
newpoints[i] = new point(x,y) newpoints[i] = new point(x,y)
drawCurve(newpoints, t) drawCurvePoint(newpoints, t)
``` ```
以上算法做了什么如果参数points列表只有一个点 就画出一个点。如果有多个点,就生成以<i>t</i>为比例的一系列点(例如,以上算法中的"标记点"),然后为新的点列表调用绘制函数。 以上算法做了什么如果参数points列表只有一个点 就画出一个点。如果有多个点,就生成以<i>t</i>为比例的一系列点(例如,以上算法中的"标记点"),然后为新的点列表调用绘制函数。

View File

@@ -15,7 +15,7 @@ We can implement curve splitting by bolting some extra logging onto the de Caste
``` ```
left=[] left=[]
right=[] right=[]
function drawCurve(points[], t): function drawCurvePoint(points[], t):
if(points.length==1): if(points.length==1):
left.add(points[0]) left.add(points[0])
right.add(points[0]) right.add(points[0])
@@ -28,7 +28,7 @@ function drawCurve(points[], t):
if(i==newpoints.length-1): if(i==newpoints.length-1):
right.add(points[i+1]) right.add(points[i+1])
newpoints[i] = (1-t) * points[i] + t * points[i+1] newpoints[i] = (1-t) * points[i] + t * points[i+1]
drawCurve(newpoints, t) drawCurvePoint(newpoints, t)
``` ```
After running this function for some value `t`, the `left` and `right` arrays will contain all the coordinates for two new curves - one to the "left" of our `t` value, the other on the "right". These new curves will have the same order as the original curve, and can be overlaid exactly on the original curve. After running this function for some value `t`, the `left` and `right` arrays will contain all the coordinates for two new curves - one to the "left" of our `t` value, the other on the "right". These new curves will have the same order as the original curve, and can be overlaid exactly on the original curve.

View File

@@ -15,7 +15,7 @@
``` ```
left=[] left=[]
right=[] right=[]
function drawCurve(points[], t): function drawCurvePoint(points[], t):
if(points.length==1): if(points.length==1):
left.add(points[0]) left.add(points[0])
right.add(points[0]) right.add(points[0])
@@ -28,7 +28,7 @@ function drawCurve(points[], t):
if(i==newpoints.length-1): if(i==newpoints.length-1):
right.add(points[i+1]) right.add(points[i+1])
newpoints[i] = (1-t) * points[i] + t * points[i+1] newpoints[i] = (1-t) * points[i] + t * points[i+1]
drawCurve(newpoints, t) drawCurvePoint(newpoints, t)
``` ```
ある値`t`に対してこの関数を実行すると、`left``right`に新しい2曲線の座標が入ります。一方は`t`の「左」側、もう一方は「右」側の曲線です。この2曲線は元の曲線と同じ次数になり、また元の曲線とぴったり重なります。 ある値`t`に対してこの関数を実行すると、`left``right`に新しい2曲線の座標が入ります。一方は`t`の「左」側、もう一方は「右」側の曲線です。この2曲線は元の曲線と同じ次数になり、また元の曲線とぴったり重なります。

View File

@@ -15,7 +15,7 @@
``` ```
left=[] left=[]
right=[] right=[]
function drawCurve(points[], t): function drawCurvePoint(points[], t):
if(points.length==1): if(points.length==1):
left.add(points[0]) left.add(points[0])
right.add(points[0]) right.add(points[0])
@@ -28,7 +28,7 @@ function drawCurve(points[], t):
if(i==newpoints.length-1): if(i==newpoints.length-1):
right.add(points[i+1]) right.add(points[i+1])
newpoints[i] = (1-t) * points[i] + t * points[i+1] newpoints[i] = (1-t) * points[i] + t * points[i+1]
drawCurve(newpoints, t) drawCurvePoint(newpoints, t)
``` ```
对某个给定 `t` 值,该函数执行后,数组 `left``right` 将包含两条曲线的所有点的坐标 -- 一条是`t`值左侧的曲线,一条是`t`值右侧的曲线, 与原始曲线同序且完全重合。 对某个给定 `t` 值,该函数执行后,数组 `left``right` 将包含两条曲线的所有点的坐标 -- 一条是`t`值左侧的曲线,一条是`t`值右侧的曲线, 与原始曲线同序且完全重合。