ベクトル

9

Click here to load reader

Transcript of ベクトル

Page 1: ベクトル

応用 CG課題レポート

2ME S110109 菅埜諒介

点 P0~P3のそれぞれの速度ベクトル V0~V3が与えられている

任意の点 P(x,y)の速度ベクトル Vを求めるプログラムを作成せよ

今回用いた環境はMicrosoft visual C++ 2010である

Page 2: ベクトル

// CG2.cpp : コンソール アプリケーションのエントリ ポイントを定義します。

//

#include "stdafx.h"

#include <iostream>

#include <complex>

int _tmain(int argc, _TCHAR* argv[])

{

/*110109_RyosukeSUGANO_tri_vector.c*/

/*

#include<stdio.h>

main()

{

*/

double x , x0 , x1 , x2 , x3 ;

double y , y0 , y1 , y2 , y3 ;

double vx , vx0 , vx1 , vx2 , vx3 ;

double vy , vy0 , vy1 , vy2 , vy3 ;

double A , A0 , A1 , A2 , A3 ;

double N0 , N1 , N2 , N3 ;

x = 0.0 ;

y = 0.0 ;

vx = 0.0 ;

vy = 0.0 ;

x0 = 0.0 ;

y0 = 0.0 ;

vx0 = 0.5 ;

vy0 = -1.0 ;

Page 3: ベクトル

x1 = 2.0 ;

y1 = 0.0 ;

vx1 = 0.5 ;

vy1 = 1.0 ;

x2 = 0.0 ;

y2 = 1.0 ;

vx2 = 2.0 ;

vy2 = 0.5 ;

x3 = 2.0 ;

y3 = 1.0 ;

vx3 = 2.0 ;

vy3 = -0.5 ;

printf("110109_RyosukeSUGANO_tri_vector¥n");

printf("P0 = [ x0 , y0 ] = [ %f , %f ] ¥n" , x0 ,y0);

printf("P1 = [ x1 , y1 ] = [ %f , %f ] ¥n" , x1 ,y1);

printf("P2 = [ x2 , y2 ] = [ %f , %f ] ¥n" , x2 ,y2);

printf("P3 = [ x3 , y3 ] = [ %f , %f ] ¥n" , x3 ,y3);

printf("V0 = [ vx0 , vy0 ] = [ %f , %f ] ¥n" , vx0 ,vy0);

printf("V1 = [ vx1 , vy1 ] = [ %f , %f ] ¥n" , vx1 ,vy1);

printf("V2 = [ vx2 , vy2 ] = [ %f , %f ] ¥n" , vx2 ,vy2);

printf("V3 = [ vx3 , vy3 ] = [ %f , %f ] ¥n" , vx3 ,vy3);

printf("求めたい x座標を入力してください( ^ω^)xは?¥n");

scanf("%lf" , &x );

printf("入力された xは x = %f です¥n", x );

printf("求めたい y座標を入力してください( ^ω^)yは?¥n");

scanf("%lf" , &y );

printf("入力された xは y = %f です¥n", y );

printf("線分 P1-P2上の点は左下と判定して計算を行います¥n");

Page 4: ベクトル

if(1 >= y && y > (-0.5*x + 1) && x <= 2 && x >= 0 ){

printf("この点は右上です¥n");

A1 = 0.5 * abs((x3 - x)*(y2 - y) - (y3 - y)*(x2 - x));

printf("A1 = %f ¥n" , A1);

A2 = 0.5 * abs((x3 - x)*(y1 - y) - (y3 - y)*(x1 - x));

printf("A2 = %f ¥n" , A2);

A3 = 0.5 * abs((x2 - x)*(y1 - y) - (y2 - y)*(x1 - x));

printf("A3 = %f ¥n" , A3);

A = A1 + A2 + A3 ;

printf("A = A1 + A2 + A3 = %f ¥n" , A);

N1 = A1/A ;

printf("N1 = %f¥n", N1);

N2 = A2/A ;

printf("N2 = %f¥n", N2);

N3 = A3/A ;

printf("N3 = %f¥n", N3);

vx = N1 * vx1 + N2 * vx2 + N3 * vx3;

printf("vx = %f¥n" , vx);

vy = N1 * vy1 + N2 * vy2 + N3 * vy3;

printf("vy = %f¥n" , vy);

printf("任意の点( x , y ) = ( %f , %f )の速度ベクトルは ( vx , vy ) = ( %f , %f )です

¥n" , x , y , vx , vy);

getchar();

}else if(0 <= y && y <= (-0.5*x + 1) && x <= 2 && x >= 0 ){

printf("この点は左下です¥n");

A0 = 0.5 * abs((x2 - x)*(y1 - y) - (y2 - y)*(x1 - x));

printf("A0 = %f ¥n" , A0);

Page 5: ベクトル

A1 = 0.5 * abs((x2 - x)*(y0 - y) - (y2 - y)*(x0 - x));

printf("A1 = %f ¥n" , A1);

A2 = 0.5 * abs((x0 - x)*(y1 - y) - (y0 - y)*(x1 - x));

printf("A2 = %f ¥n" , A2);

A = A0 + A1 + A2 ;

printf("A = A0 + A1 + A2 = %f ¥n" , A);

N0 = A0/A ;

printf("N0 = %f¥n", N0);

N1 = A1/A ;

printf("N1 = %f¥n", N1);

N2 = A2/A ;

printf("N2 = %f¥n", N2);

vx = N0 * vx0 + N1 * vx1 + N2 * vx2 ;

printf("vx = %f¥n" , vx);

vy = N0 * vy0 + N1 * vy1 + N2 * vy2 ;

printf("vy = %f¥n" , vy);

printf("任意の点( x , y ) = ( %f , %f )の速度ベクトルは ( vx , vy ) = ( %f , %f )です

¥n" , x , y , vx , vy);

getchar();

}else{

printf("おまえバカだお( ^ω^)四角の中の座標を入力するお(#^ω^)");

getchar();

}

/*

}

*/

getchar();

}

Page 6: ベクトル

実行結果

テストパターン任意の点 P=(2 , 1)のとき、右上と判定され速度ベクトルは P3のものとなる

110109_RyosukeSUGANO_tri_vector

P0 = [ x0 , y0 ] = [ 0.000000 , 0.000000 ]

P1 = [ x1 , y1 ] = [ 2.000000 , 0.000000 ]

P2 = [ x2 , y2 ] = [ 0.000000 , 1.000000 ]

P3 = [ x3 , y3 ] = [ 2.000000 , 1.000000 ]

V0 = [ vx0 , vy0 ] = [ 0.500000 , -1.000000 ]

V1 = [ vx1 , vy1 ] = [ 0.500000 , 1.000000 ]

V2 = [ vx2 , vy2 ] = [ 2.000000 , 0.500000 ]

V3 = [ vx3 , vy3 ] = [ 2.000000 , -0.500000 ]

求めたい x座標を入力してください( ^ω^)xは?

2

入力された xは x = 2.000000 です

求めたい y座標を入力してください( ^ω^)yは?

1

入力された xは y = 1.000000 です

線分 P1-P2上の点は左下と判定して計算を行います

この点は右上です

A1 = 0.000000

A2 = 0.000000

A3 = 1.000000

A = A1 + A2 + A3 = 1.000000

N1 = 0.000000

N2 = 0.000000

N3 = 1.000000

vx = 2.000000

vy = -0.500000

任意の点( x , y ) = ( 2.000000 , 1.000000 )の速度ベクトルは ( vx , vy ) = ( 2.00

0000 , -0.500000 )です

正しい結果が得られた

Page 7: ベクトル

テストパターン任意の点 P=(0 , 0)のとき、左下と判定され速度ベクトルは P0のものとなる

110109_RyosukeSUGANO_tri_vector

P0 = [ x0 , y0 ] = [ 0.000000 , 0.000000 ]

P1 = [ x1 , y1 ] = [ 2.000000 , 0.000000 ]

P2 = [ x2 , y2 ] = [ 0.000000 , 1.000000 ]

P3 = [ x3 , y3 ] = [ 2.000000 , 1.000000 ]

V0 = [ vx0 , vy0 ] = [ 0.500000 , -1.000000 ]

V1 = [ vx1 , vy1 ] = [ 0.500000 , 1.000000 ]

V2 = [ vx2 , vy2 ] = [ 2.000000 , 0.500000 ]

V3 = [ vx3 , vy3 ] = [ 2.000000 , -0.500000 ]

求めたい x座標を入力してください( ^ω^)xは?

0

入力された xは x = 0.000000 です

求めたい y座標を入力してください( ^ω^)yは?

0

入力された xは y = 0.000000 です

線分 P1-P2上の点は左下と判定して計算を行います

この点は左下です

A0 = 1.000000

A1 = 0.000000

A2 = 0.000000

A = A0 + A1 + A2 = 1.000000

N0 = 1.000000

N1 = 0.000000

N2 = 0.000000

vx = 0.500000

vy = -1.000000

任意の点( x , y ) = ( 0.000000 , 0.000000 )の速度ベクトルは ( vx , vy ) = ( 0.50

0000 , -1.000000 )です

正しい結果が得られた

Page 8: ベクトル

テストパターン任意の点 P=(1 , 0.5)のとき、線上なので左下と判定される

110109_RyosukeSUGANO_tri_vector

P0 = [ x0 , y0 ] = [ 0.000000 , 0.000000 ]

P1 = [ x1 , y1 ] = [ 2.000000 , 0.000000 ]

P2 = [ x2 , y2 ] = [ 0.000000 , 1.000000 ]

P3 = [ x3 , y3 ] = [ 2.000000 , 1.000000 ]

V0 = [ vx0 , vy0 ] = [ 0.500000 , -1.000000 ]

V1 = [ vx1 , vy1 ] = [ 0.500000 , 1.000000 ]

V2 = [ vx2 , vy2 ] = [ 2.000000 , 0.500000 ]

V3 = [ vx3 , vy3 ] = [ 2.000000 , -0.500000 ]

求めたい x座標を入力してください( ^ω^)xは?

1

入力された xは x = 1.000000 です

求めたい y座標を入力してください( ^ω^)yは?

0.5

入力された xは y = 0.500000 です

線分 P1-P2上の点は左下と判定して計算を行います

この点は左下です

A0 = 0.000000

A1 = 0.500000

A2 = 0.500000

A = A0 + A1 + A2 = 1.000000

N0 = 0.000000

N1 = 0.500000

N2 = 0.500000

vx = 1.250000

vy = 0.750000

任意の点( x , y ) = ( 1.000000 , 0.500000 )の速度ベクトルは ( vx , vy ) = ( 1.25

0000 , 0.750000 )です

正しい結果が得られた

Page 9: ベクトル

テストパターン任意の点 P=(10 , 10)のとき、四角形の外なのでエラーを返す

110109_RyosukeSUGANO_tri_vector

P0 = [ x0 , y0 ] = [ 0.000000 , 0.000000 ]

P1 = [ x1 , y1 ] = [ 2.000000 , 0.000000 ]

P2 = [ x2 , y2 ] = [ 0.000000 , 1.000000 ]

P3 = [ x3 , y3 ] = [ 2.000000 , 1.000000 ]

V0 = [ vx0 , vy0 ] = [ 0.500000 , -1.000000 ]

V1 = [ vx1 , vy1 ] = [ 0.500000 , 1.000000 ]

V2 = [ vx2 , vy2 ] = [ 2.000000 , 0.500000 ]

V3 = [ vx3 , vy3 ] = [ 2.000000 , -0.500000 ]

求めたい x座標を入力してください( ^ω^)xは?

10

入力された xは x = 10.000000 です

求めたい y座標を入力してください( ^ω^)yは?

10

入力された xは y = 10.000000 です

線分 P1-P2上の点は左下と判定して計算を行います

おまえバカだお( ^ω^)四角の中の座標を入力するお(#^ω^)

正しい結果が得られた