| 情報学部 | 菅沼ホーム | 目次 | 索引 |
/****************************/
/* n次ベジエ曲線 */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
double *Bezier(int, double **, double);
int main()
{
double **B, t, step = 0.05, *P;
int i1, n;
// 設定
n = 3;
B = new double *[n+1];
for (i1 = 0; i1 <= n; i1++)
B[i1] = new double [2];
B[0][0] = 1.0;
B[0][1] = 1.0;
B[1][0] = 2.0;
B[1][1] = 3.0;
B[2][0] = 4.0;
B[2][1] = 3.0;
B[3][0] = 3.0;
B[3][1] = 1.0;
// 実行と出力
t = 0.0;
for (i1 = 0; i1 <= 20; i1++) {
P = Bezier(n, B, t);
printf("%f %f %f\n", t, P[0], P[1]);
t += step;
}
for (i1 = 0; i1 <= n; i1++)
delete [] B[i1];
delete [] B;
delete [] P;
return 0;
}
/*******************************/
/* n次ベジエ曲線 */
/* n : 次数 */
/* B : 多角形の頂点座標 */
/* t : 計算したい点の位置 */
/* return : 座標 */
/* coded by Y.Suganuma */
/*******************************/
double brend(int, int, double);
double kaijo(int);
double *Bezier(int n, double **B, double t)
{
double *P, J;
int i;
// 初期設定
P = new double [2];
P[0] = 0.0;
P[1] = 0.0;
// 計算
for (i = 0; i <= n; i++) {
J = brend(n, i, t);
P[0] += B[i][0] * J;
P[1] += B[i][1] * J;
}
return P;
}
/*******************************/
/* ベジエ基底関数 */
/* n,i : 次数 */
/* t : 計算したい点の位置 */
/* return : 結果 */
/*******************************/
double brend(int n, int i, double t)
{
double ni, x = 1.0, y = 1.0;
int i1;
ni = kaijo(i) * kaijo(n-i);
ni = kaijo(n) / ni;
for (i1 = 1; i1 <= i; i1++)
x *= t;
t = 1.0 - t;
for (i1 = 1; i1 <= n-i; i1++)
y *= t;
return ni * x * y;
}
/*****************/
/* nの階乗の計算 */
/*****************/
double kaijo(int n)
{
double k = 1.0;
int i1;
if (n > 1) {
for (i1 = 2; i1 <= n; i1++)
k *= i1;
}
return k;
}
/****************************/
/* n次ベジエ曲線 */
/* coded by Y.Suganuma */
/****************************/
import java.io.*;
public class Test {
public static void main(String args[]) throws IOException
{
double B[][], t, step = 0.05, P[];
int i1, n;
// 設定
n = 3;
B = new double [n+1][2];
B[0][0] = 1.0;
B[0][1] = 1.0;
B[1][0] = 2.0;
B[1][1] = 3.0;
B[2][0] = 4.0;
B[2][1] = 3.0;
B[3][0] = 3.0;
B[3][1] = 1.0;
// 実行と出力
t = 0.0;
for (i1 = 0; i1 <= 20; i1++) {
P = bezier(n, B, t);
System.out.println(t + " " + P[0] + " " + P[1]);
t += step;
}
}
/*******************************/
/* n次ベジエ曲線 */
/* n : 次数 */
/* B : 多角形の頂点座標 */
/* t : 計算したい点の位置 */
/* return : 座標 */
/* coded by Y.Suganuma */
/*******************************/
static double [] bezier(int n, double B[][], double t)
{
double P[], J;
int i;
// 初期設定
P = new double [2];
P[0] = 0.0;
P[1] = 0.0;
// 計算
for (i = 0; i <= n; i++) {
J = brend(n, i, t);
P[0] += B[i][0] * J;
P[1] += B[i][1] * J;
}
return P;
}
/*******************************/
/* ベジエ基底関数 */
/* n,i : 次数 */
/* t : 計算したい点の位置 */
/* return : 結果 */
/*******************************/
static double brend(int n, int i, double t)
{
double ni, x = 1.0, y = 1.0;
int i1;
ni = kaijo(i) * kaijo(n-i);
ni = kaijo(n) / ni;
for (i1 = 1; i1 <= i; i1++)
x *= t;
t = 1.0 - t;
for (i1 = 1; i1 <= n-i; i1++)
y *= t;
return ni * x * y;
}
/*****************/
/* nの階乗の計算 */
/*****************/
static double kaijo(int n)
{
double k = 1.0;
int i1;
if (n > 1) {
for (i1 = 2; i1 <= n; i1++)
k *= i1;
}
return k;
}
}
<!DOCTYPE HTML>
<HTML>
<HEAD>
<TITLE>補間法(ベジエ曲線)</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
<SCRIPT TYPE="text/javascript">
function main()
{
// データの設定
let n = parseInt(document.getElementById("order").value);
let sp = parseFloat(document.getElementById("step").value);
let B = new Array();
for (let i1 = 0; i1 < n+1; i1++)
B[i1] = new Array();
let s = (document.getElementById("data").value).split(/ {1,}|\n{1,}/);
let k = 0;
for (let i1 = 0; i1 < 2*(n+1); i1 += 2) {
B[k][0] = parseFloat(s[i1]);
B[k][1] = parseFloat(s[i1+1]);
k++;
}
let P = new Array();
// 出力
let str = "";
let t = 0.0;
while (t < 1.0+0.01*sp) {
P = Bezier(n, B, t);
str = str + "x " + P[0] + " y " + P[1] + "\n";
t += sp;
}
document.getElementById("ans").value = str;
}
/*******************************/
/* n次ベジエ曲線 */
/* n : 次数 */
/* B : 多角形の頂点座標 */
/* t : 計算したい点の位置 */
/* return : 座標 */
/* coded by Y.Suganuma */
/*******************************/
function Bezier(n, B, t)
{
let P = new Array();
P[0] = 0.0;
P[1] = 0.0;
let J;
let i;
// 計算
for (i = 0; i <= n; i++) {
J = brend(n, i, t);
P[0] += B[i][0] * J;
P[1] += B[i][1] * J;
}
return P;
}
/*******************************/
/* ベジエ基底関数 */
/* n,i : 次数 */
/* t : 計算したい点の位置 */
/* return : 結果 */
/*******************************/
function brend(n, i, t)
{
let ni;
let x = 1.0;
let y = 1.0;
let i1;
ni = kaijo(i) * kaijo(n-i);
ni = kaijo(n) / ni;
for (i1 = 1; i1 <= i; i1++)
x *= t;
t = 1.0 - t;
for (i1 = 1; i1 <= n-i; i1++)
y *= t;
return ni * x * y;
}
/*****************/
/* nの階乗の計算 */
/*****************/
function kaijo(n)
{
let k = 1.0;
let i1;
if (n > 1) {
for (i1 = 2; i1 <= n; i1++)
k *= i1;
}
return k;
}
</SCRIPT>
</HEAD>
<BODY STYLE="font-size: 130%; background-color: #eeffee;">
<H2 STYLE="text-align:center"><B>補間法(ベジエ曲線)</B></H2>
<DL>
<DT> テキストフィールドおよびテキストエリアには,例として,ベジエ多角形を B<SUB>0</SUB> = (1 1),B<SUB>1</SUB> = (2 3),B<SUB>2</SUB> = (4 3),B<SUB>3</SUB> = (3 1) としたときの値が設定されています.他の問題を実行する場合は,それらを適切に修正してください.
</DL>
<DIV STYLE="text-align:center">
次数(n):<INPUT ID="order" STYLE="font-size: 100%" TYPE="text" SIZE="2" VALUE="3">
ステップ:<INPUT ID="step" STYLE="font-size: 100%;" TYPE="text" SIZE="5" VALUE="0.05">
<BUTTON STYLE="font-size: 100%; background-color: pink" onClick="main()">OK</BUTTON><BR><BR>
頂点座標(x y,(n+1)個):<TEXTAREA ID="data" COLS="30" ROWS="15" STYLE="font-size: 100%">1.0 1.0
2.0 3.0
4.0 3.0
3.0 1.0</TEXTAREA><BR><BR>
<TEXTAREA ID="ans" COLS="50" ROWS="15" STYLE="font-size: 100%"></TEXTAREA>
</DIV>
</BODY>
</HTML>
<?php
/****************************/
/* n次ベジエ曲線 */
/* coded by Y.Suganuma */
/****************************/
// 設定
$step = 0.05;
$n = 3;
$B = array($n+1);
for ($i1 = 0; $i1 <= $n; $i1++)
$B[$i1] = array(2);
$B[0][0] = 1.0;
$B[0][1] = 1.0;
$B[1][0] = 2.0;
$B[1][1] = 3.0;
$B[2][0] = 4.0;
$B[2][1] = 3.0;
$B[3][0] = 3.0;
$B[3][1] = 1.0;
// 実行と出力
$t = 0.0;
for ($i1 = 0; $i1 <= 20; $i1++) {
$P = Bezier($n, $B, $t);
printf("%f %f %f\n", $t, $P[0], $P[1]);
$t += $step;
}
/*******************************/
/* n次ベジエ曲線 */
/* n : 次数 */
/* B : 多角形の頂点座標 */
/* t : 計算したい点の位置 */
/* return : 座標 */
/* coded by Y.Suganuma */
/*******************************/
function Bezier($n, $B, $t)
{
// 初期設定
$P = array(2);
$P[0] = 0.0;
$P[1] = 0.0;
// 計算
for ($i = 0; $i <= $n; $i++) {
$J = brend($n, $i, $t);
$P[0] += $B[$i][0] * $J;
$P[1] += $B[$i][1] * $J;
}
return $P;
}
/*******************************/
/* ベジエ基底関数 */
/* n,i : 次数 */
/* t : 計算したい点の位置 */
/* return : 結果 */
/*******************************/
function brend($n, $i, $t)
{
$x = 1.0;
$y = 1.0;
$ni = kaijo($i) * kaijo($n-$i);
$ni = kaijo($n) / $ni;
for ($i1 = 1; $i1 <= $i; $i1++)
$x *= $t;
$t = 1.0 - $t;
for ($i1 = 1; $i1 <= $n-$i; $i1++)
$y *= $t;
return $ni * $x * $y;
}
/*****************/
/* nの階乗の計算 */
/*****************/
function kaijo($n)
{
$k = 1.0;
if ($n > 1) {
for ($i1 = 2; $i1 <= $n; $i1++)
$k *= $i1;
}
return $k;
}
?>
#***************************/
# n次ベジエ曲線 */
# coded by Y.Suganuma */
#***************************/
#******************************/
# n次ベジエ曲線 */
# n : 次数 */
# B : 多角形の頂点座標 */
# t : 計算したい点の位置 */
# return : 座標 */
# coded by Y.Suganuma */
#******************************/
def Bezier(n, b, t)
# 初期設定
p = [0.0, 0.0]
# 計算
for i in 0 ... n+1
j = brend(n, i, t)
p[0] += b[i][0] * j
p[1] += b[i][1] * j
end
return p
end
#******************************/
# ベジエ基底関数 */
# n,i : 次数 */
# t : 計算したい点の位置 */
# return : 結果 */
#******************************/
def brend(n, i, t)
x = 1.0
y = 1.0
ni = kaijo(i) * kaijo(n-i)
ni = kaijo(n) / ni
for i1 in 1 ... i+1
x *= t
end
t = 1.0 - t
for i1 in 1 ... n-i+1
y *= t
end
return ni * x * y
end
#****************/
# nの階乗の計算 */
#****************/
def kaijo(n)
k = 1.0
if n > 1
for i1 in 2 ... n+1
k *= i1
end
end
return k
end
# 設定
step = 0.05
n = 3
b = [[1.0, 1.0], [2.0, 3.0], [4.0, 3.0], [3.0, 1.0]]
# 実行と出力
t = 0.0
for i1 in 0 ... 21
p = Bezier(n, b, t)
printf("%f %f %f\n", t, p[0], p[1])
t += step
end
# -*- coding: UTF-8 -*- import numpy as np from math import * ############################### # n次ベジエ曲線 # n : 次数 # B : 多角形の頂点座標 # t : 計算したい点の位置 # return : 座標 # coded by Y.Suganuma ################################ def Bezier(n, B, t) : # 初期設定 P = np.array([0, 0,], np.float) # 計算 for i in range(0, n+1) : J = brend(n, i, t) P[0] += B[i][0] * J P[1] += B[i][1] * J return P ############################## # ベジエ基底関数 # n,i : 次数 # t : 計算したい点の位置 # return : 結果 ############################## def brend(n, i, t) : x = 1.0 y = 1.0 ni = kaijo(i) * kaijo(n-i) ni = kaijo(n) / ni for i1 in range(1, i+1) : x *= t t = 1.0 - t for i1 in range(1, n-i+1) : y *= t return (ni * x * y) ################ # nの階乗の計算 ################ def kaijo(n) : k = 1.0 if n > 1 : for i1 in range(2, n+1) : k *= i1 return k ############################ # n次ベジエ曲線 # coded by Y.Suganuma ############################ # 設定 step = 0.05 n = 3 B = np.array([[1, 1], [2, 3], [4, 3], [3, 1]], np.float) t = 0.0 # 実行と出力 for i1 in range(0, 21) : P = Bezier(n, B, t) print(t, P[0], P[1]) t += step
/****************************/
/* n次ベジエ曲線 */
/* coded by Y.Suganuma */
/****************************/
using System;
class Program
{
static void Main()
{
Test1 ts = new Test1();
}
}
class Test1
{
public Test1()
{
// 設定
int n = 3;
double[][] B = new double [n+1][];
B[0] = new double[] {1.0, 1.0};
B[1] = new double[] {2.0, 3.0};
B[2] = new double[] {4.0, 3.0};
B[3] = new double[] {3.0, 1.0};
// 実行と出力
double t = 0.0;
double step = 0.05;
for (int i1 = 0; i1 <= 20; i1++) {
double[] P = bezier(n, B, t);
Console.WriteLine(t + " " + P[0] + " " + P[1]);
t += step;
}
}
/*******************************/
/* n次ベジエ曲線 */
/* n : 次数 */
/* B : 多角形の頂点座標 */
/* t : 計算したい点の位置 */
/* return : 座標 */
/* coded by Y.Suganuma */
/*******************************/
double[] bezier(int n, double[][] B, double t)
{
// 初期設定
double[] P = {0.0, 0.0};
// 計算
for (int i = 0; i <= n; i++) {
double J = brend(n, i, t);
P[0] += B[i][0] * J;
P[1] += B[i][1] * J;
}
return P;
}
/*******************************/
/* ベジエ基底関数 */
/* n,i : 次数 */
/* t : 計算したい点の位置 */
/* return : 結果 */
/*******************************/
double brend(int n, int i, double t)
{
double ni = kaijo(n) / (kaijo(i) * kaijo(n-i));
double x = 1.0;
for (int i1 = 1; i1 <= i; i1++)
x *= t;
double y = 1.0;
t = 1.0 - t;
for (int i1 = 1; i1 <= n-i; i1++)
y *= t;
return (ni * x * y);
}
/*****************/
/* nの階乗の計算 */
/*****************/
double kaijo(int n)
{
double k = 1.0;
if (n > 1) {
for (int i1 = 2; i1 <= n; i1++)
k *= i1;
}
return k;
}
}
''''''''''''''''''''''''''''
' n次ベジエ曲線 '
' coded by Y.Suganuma '
''''''''''''''''''''''''''''
Module Test
Sub Main()
' 設定
Dim n As Integer = 3
Dim B(,) = {{1.0, 1.0}, {2.0, 3.0}, {4.0, 3.0}, {3.0, 1.0}}
' 実行と出力
Dim t As Double = 0.0
Dim sp As Double = 0.05
For i1 As Integer = 0 To 20
Dim P() As Double = bezier(n, B, t)
Console.WriteLine(t & " " & P(0) & " " & P(1))
t += sp
Next
End Sub
'''''''''''''''''''''''''''''''
' n次ベジエ曲線 '
' n : 次数 '
' B : 多角形の頂点座標 '
' t : 計算したい点の位置 '
' return : 座標 '
' coded by Y.Suganuma '
'''''''''''''''''''''''''''''''
Function bezier(n As Integer, B(,) As Double, t As Double)
' 初期設定
Dim P() As Double = {0.0, 0.0}
' 計算
For i As Integer = 0 To n
Dim J As Double = brend(n, i, t)
P(0) += B(i,0) * J
P(1) += B(i,1) * J
Next
Return P
End Function
'''''''''''''''''''''''''''''''
' ベジエ基底関数 '
' n,i : 次数 '
' t : 計算したい点の位置 '
' return : 結果 '
'''''''''''''''''''''''''''''''
Function brend(n As Integer, i As Integer, t As Double)
Dim ni As Double = kaijo(n) / (kaijo(i) * kaijo(n-i))
Dim x As Double = 1.0
For i1 As Integer = 1 To i
x *= t
Next
Dim y As Double = 1.0
t = 1.0 - t
For i1 As Integer = 1 To n-i
y *= t
Next
Return (ni * x * y)
End Function
'***************'
' nの階乗の計算 '
'***************'
Function kaijo(n As Integer)
Dim k As Double = 1.0
If n > 1
For i1 As Integer = 2 To n
k *= i1
Next
End If
Return k
End Function
End Module
| 情報学部 | 菅沼ホーム | 目次 | 索引 |