応用 CG課題レポート
2ME S110109 菅埜諒介
点 P0~P3のそれぞれの速度ベクトル V0~V3が与えられている
任意の点 P(x,y)の速度ベクトル Vを求めるプログラムを作成せよ
今回用いた環境はMicrosoft visual C++ 2010である
// 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 ;
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");
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);
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();
}
実行結果
テストパターン任意の点 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 )です
正しい結果が得られた
テストパターン任意の点 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 )です
正しい結果が得られた
テストパターン任意の点 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 )です
正しい結果が得られた
テストパターン任意の点 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上の点は左下と判定して計算を行います
おまえバカだお( ^ω^)四角の中の座標を入力するお(#^ω^)
正しい結果が得られた