| 情報学部 | 菅沼ホーム | 目次 | 索引 | 
/****************************/
/* 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
			
| 情報学部 | 菅沼ホーム | 目次 | 索引 |