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

View File

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

View File

@@ -26,20 +26,20 @@
让我们使用刚才描述过的算法,并实现它:
```
function drawCurve(points[], t):
function drawCurvePoint(points[], t):
if(points.length==1):
draw(points[0])
else:
newpoints=array(points.size-1)
for(i=0; i<newpoints.length; i++):
newpoints[i] = (1-t) * points[i] + t * points[i+1]
drawCurve(newpoints, t)
drawCurvePoint(newpoints, t)
```
好了,这就是算法的实现。一般来说你不能随意重载“+”操作符,因此我们给出计算`x``y`坐标的实现:
```
function drawCurve(points[], t):
function drawCurvePoint(points[], t):
if(points.length==1):
draw(points[0])
else:
@@ -48,7 +48,7 @@ function drawCurve(points[], t):
x = (1-t) * points[i].x + t * points[i+1].x
y = (1-t) * points[i].y + t * points[i+1].y
newpoints[i] = new point(x,y)
drawCurve(newpoints, t)
drawCurvePoint(newpoints, t)
```
以上算法做了什么如果参数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=[]
right=[]
function drawCurve(points[], t):
function drawCurvePoint(points[], t):
if(points.length==1):
left.add(points[0])
right.add(points[0])
@@ -28,7 +28,7 @@ function drawCurve(points[], t):
if(i==newpoints.length-1):
right.add(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.

View File

@@ -15,7 +15,7 @@
```
left=[]
right=[]
function drawCurve(points[], t):
function drawCurvePoint(points[], t):
if(points.length==1):
left.add(points[0])
right.add(points[0])
@@ -28,7 +28,7 @@ function drawCurve(points[], t):
if(i==newpoints.length-1):
right.add(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曲線は元の曲線と同じ次数になり、また元の曲線とぴったり重なります。

View File

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