光の反射

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
telr

光の反射

#1

投稿記事 by telr » 13年前

DXライブラリとmath関数を使って、光の反射の描画は、可能でしょうか?
可能な、場合、どのようにやればよいのかわかりやすく教えてもらえるとありがたいです。
言語はC言語の基礎位はわかります。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 光の反射

#2

投稿記事 by h2so5 » 13年前

「光の反射の描画」とは具体的にどういうモノなのか説明してください。

telf

Re: 光の反射

#3

投稿記事 by telf » 13年前

エットですね・・・
言うなら、物理で習う光の入射角=反射角の式に当てはめてその角度で、線を書きたいんですけど・・・
これで、わからなかったらすいません・・・

non
記事: 1097
登録日時: 14年前

Re: 光の反射

#4

投稿記事 by non » 13年前

反射する前までのプログラムを書いてもらえますか。
non

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 光の反射

#5

投稿記事 by beatle » 13年前

まずはDXライブラリのことを一切考えず,数学的にどうやってやればいいかを考えるといいでしょう.

なぜかというと,DXライブラリは基本的に,指定された2つの座標に線を引くとか,指定された位置に指定された大きさの球を描くことしかしてくれないからです.自動的に入射角=反射角の式を用いて線を引いてくれる,という機能はありません.
つまり,まずは描画のことは一切考慮せず,描きたい直線の式を求めればいいということです.

描きたい直線の式が求まったらプログラムに落とし込みます.

telf

Re: 光の反射

#6

投稿記事 by telf » 13年前

前の説明が少しアバウトだったので、説明しま押します。
テイルズオブグレイセスをやったことがある人ならわかると思うのですが、
ダンジョンのなかに、レンズを回転させて光を奥まで、届くようにするという仕掛けが、
あったと思うのですが、あれと似たようなことをやりたいと考えています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#7

投稿記事 by softya(ソフト屋) » 13年前

ところで3Dなのか2Dなのかをお聞きして良いですか?
後DrawLineとかを使ってプログラムは組めますか?
【補足】nonさんも書いていますが、telfさんがプログラムを組むのが前提で我々はそれをお手伝いするだけです。
理論を理解しないと応用できないと思いますので、分かるところだけでもプログラムを組んでもらって問題点を明確にして行きましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#8

投稿記事 by telf » 13年前

コード:


#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

    int Cr;
	int x=200,y=200;
	Cr=GetColor(255,255,255);

    // while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
    while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
		DrawLine(x ,y ,300 ,300 ,Cr);           //入射光
		DrawLine(300 ,300 ,400 ,200 ,Cr);       //反射光
		DrawLine(200 ,300 ,400 ,300 ,Cr);      //鏡の変わり
	}

        DxLib_End(); // DXライブラリ終了処理
        return 0;
}
イメージ的にこんな感じです。
2Dです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#9

投稿記事 by softya(ソフト屋) » 13年前

鏡の反射は純粋に数学的な計算になりますが、
(1)直線の方程式
(2)2直線の交点の座標
(3)2つの線分のなす角度
で求め方分からないものがありますか?

出来れば習っているか確認したいので学年とかも教えてもらってよいでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#10

投稿記事 by telf » 13年前

学年は高3です。
(1)はy=ax、y=ax+bのやつですよね?

(2)は例y=ax2とy=ax+bの連立で求めるやつですよね?

(3)はちょっとわからない(覚えてないだけかもしれないですけど。)

(1)、(2)、(3)で求められるんですね!

自分の頭のなかでは、#defineでcosθ(0~90)を定義して
斜辺や底辺を定義してcosθを求めるのかと思っていました。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 光の反射

#11

投稿記事 by h2so5 » 13年前

もし入射光がベクトルで与えられていて、
鏡が画面に並行か垂直である場合は三角関数を使わなくても簡単に計算できますね。
telf さんが書きました: 自分の頭のなかでは、#defineでcosθ(0~90)を定義して
斜辺や底辺を定義してcosθを求めるのかと思っていました。
C言語ではcos関数があるので予め定義する必要はありません。
速度が要求される場合はテーブルを作っておく場合もありますが。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#12

投稿記事 by softya(ソフト屋) » 13年前

私の方法は鏡が自由に動く前提で、高校3年なら理解できると思います。

(1)はそのとおりです。

(2)は(1)の2つの直線の方程式の交わる点を求めること。1つの直線は光線でもう一つの直線は鏡の面です。
つまり、鏡の面の何処にあたっているかを求めるのに使います。ここを基準に光は反射されるのと入ってきた光線はここまで止まります。
「2年3章7回」
http://sakura.canvas.ne.jp/spr/ynaka/2nen-3/2307.html
ただし交点が鏡の面のサイズ範囲にあることの確認は必要です。

(3)は入射角を求めるのに使います。(2)と同様に光線と鏡です。
「2直線のなす角」
http://w3e.kanazawa-it.ac.jp/math/categ ... ukaku.html
「線分の角度関係が簡単に分かる便利なテクニック」
http://www.h4.dion.ne.jp/~zero1341/t/04.htm

以上です。
交点と入射角が分かったので反射角は求まりますので入射光と反射光は、これで描画できます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#13

投稿記事 by telf » 13年前

コード:

#include "DxLib.h"
#include <math.h>



int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

    int Cr;
	int a=20,x=10;
	int y=a*x;
	int z=-a*x;
	
	Cr=GetColor(255,255,255);

    // while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
    while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
		
		DrawLine(0,0,a,y,Cr);
	
	}

        DxLib_End(); // DXライブラリ終了処理
        return 0;
}
言われていることは、わかるのですが、それをソースに直すとわからなくなります。
上のソースは試しで打ちました。
変数yの値を変えるには変数への代入しかないでしょうか?
また、Cで連立方程式はどのようにやればよいのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 光の反射

#14

投稿記事 by みけCAT » 13年前

(1次)連立方程式の解き方はこちらを参考にどうぞ。
http://dixq.net/forum/blog.php?u=536&b=2655
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#15

投稿記事 by softya(ソフト屋) » 13年前

DXライブラリ以前にC言語で問題を解くことが出来ていない様ですね。
簡単なものからプログラムを書いてみましょうか。

(1)の直線の方程式をプログラムしてみましょう。
例えばx1=10,y1=50とx2=100,y2=130が与えられた時にこの2点を通る直線の方程式y=ax+bのaとbを求めるプログラムを書いてみてください。
もし余力があればDXライブラリで実際に線を引いてみましょう。ただし、y=0からy=400までの線を引きます。上で求めたaとbを使って計算して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#16

投稿記事 by telf » 13年前

コード:

#include <stdio.h>
#include <math.h>

int main(){
	int a1,a2,b1,b2  ;
	int x1=10,y1=50    ; /*一次方程式①のx座標、y座標*/
    int x2=100,y2=130  ; /*一次方程式②のx座標、y座標*/

      /*1次方程式①y1=a1*x1+b1*/
		b1=y1/(a1*x1) ;
		a1=(b1-y1)/x1 ;
		printf("b1の値は%dです。a1の値は%dです。\n",b1,a1);

	  /*一次方程式②y2=a2*2+b2 */
		b2=y2/(a2*x2) ;
		a2=(b2-y2)/x2 ;
		printf("b2の値は%dです。a2の値は%dです。\n",b2,a2);

		return 0;
}
変数a1,a2,b1,b2 は値が?な訳ですから、このまま使う訳ですけど、
エラー C4700: 初期化されていないローカル変数 が使用されます
と出ました。どうすれば良いのでしょうか?
また,式としてはこれであっているでしょうか?

non
記事: 1097
登録日時: 14年前

Re: 光の反射

#17

投稿記事 by non » 13年前

たぶん、10行11行で、切片と傾きを求めようとしているのでしょうが、
直線の方程式を求めるためには、2か所の座標が分からないと求められませんよ。

[編集]
ソフト屋さんの問題を見てなかった。計算式が間違ってますというのが正しいですね。失礼しました。

y1=a*x1+b
y2=a*x2+b
の連立方程式から
a,bの式を求めます。
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#18

投稿記事 by softya(ソフト屋) » 13年前

●数学的な問題点
数学的に考えて2点しか与えられていないので1つの直線の方程式しか求められません。
もう一度数学の教科書を読み直してみましょう。
「2点を通る直線の方程式」 ← 参考
http://www.geisya.or.jp/~mwm48961/math3 ... func1.html

●プログラミングとしての問題点。
a1,b1を求めるのにb1=y1/(a1*x1) ;としたらa1と言う不定値を使っていることになります。これがC4700エラーの原因です。
上から順番で実行されるプログラムの流れ的にNGですのでプログラミングの基礎として流れを意識することは非常に重要です。よく考えてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#19

投稿記事 by telf » 13年前

コード:

/*
***********************************************************
*      連立方程式の解法(ガウス・ジョルダン法)           *
***********************************************************
*/
/*y=ax+b*/
/*x1=10,y1=50,x2=100,y2=130*/

#include <stdio.h>
#include <math.h>

#define N 2 /*元の数*/

void main(void)
{                                          
	double A[N] [N+1]={{50, 10, 1},  /*********/
	                   {130, 100, 1}};/* 係数行列*/
	                  
	double p,d;
	int i,j,k;

	for(k=0;k<N;k++){
		p=A[k][k];
		for (j=k;j<N;j++){
			A[k][j]=A[k][j]/p;
		for(i=0;i<N;i++){
			if(i!=k){
				d=A[i][k];
				for(j=k;j<N;j++)
					A[i][j]=A[i][j]-d*A[k][i];
				}
			}
		}

		for(k=0;k<N;k++)
			printf("x%d=%f\n",k+1,A[k][N]);
		}
	}
C言語の初めてのアルゴリズム入門より
22行までは、処理の内容を理解できたのですが、そのあとが、よくわからないので、どこをどう変えて、a,bを求めればわからなくて、
詰まってます。
また、前回のソフト屋さんの投稿で、連立でやるといわれたこと忘れてました。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 光の反射

#20

投稿記事 by みけCAT » 13年前

参考にしたサイトor本にこのままのコードが載っていたのですか?
インデントを整えた方がいいですよ。

↓C言語インデント補正マシン
http://www34.atpages.jp/mikecat/js/indent/index.html
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#21

投稿記事 by softya(ソフト屋) » 13年前

肝心のアルゴリズムが分からないといった感じですね。
実際の所簡単な式なのでガウス・ジョルダン法を使わなくても解けます。
y1=x1*a+b
y2=x2*a+b
の連立方程式からaを求める式とbを求める式を作り出してみてください。
普通に学校で習う方法で出来ますよ。

「中二/連立方程式1」
http://www.geisya.or.jp/~mwm48961/math/qu_2_1.htm

【補足】ちなみに後々のためにプログラム化するときにx1,x2,y1,y2の変数は必ず使って下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#22

投稿記事 by telf » 13年前

コード:

#include <stdio.h>
#include <math.h>

int main(){
	int a,b    ;
	int x1=10,y1=50    ; /*一次方程式①のx座標、y座標*/
    int x2=20,y2=120  ; /*一次方程式①のx座標、y座標*/
	/*連立方程式加減法*/
	/*{y1=a*x1+b*/
    /*{y2=a*x2+b*/
	/*-10a=50-120*/
	/*   a=7     */
	/*b=70-50    */
	/*b=20       */
	a=(50-120)/-10 ;
	b=a*x1-y1;
	printf("a=%dです。b=%dです。\n",a,b);
	return 0;
}
※値がしっくりこなかったので、代えさせてもらいました。
これで、合ってるでしょうか

non
記事: 1097
登録日時: 14年前

Re: 光の反射

#23

投稿記事 by non » 13年前

>a=(50-120)/-10 ;
x1,x2,y1,y2を使って表さなきゃ。
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#24

投稿記事 by softya(ソフト屋) » 13年前

素直に式を代入法で変換するだけなのですが・・・。
自分で答えがあっているか検証できるので試してみてください。
a,bが求まればx1からy1、x2からy2が計算できるはずです。
あとaとbを求める式をちゃんとx1,x2,y1,y2で書いて下さい。

残念ですが違います。ごく基本的なミスをされてます。

コード:

    a=(50-120)/-10 ;
    b=a*x1-y1;
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telr

Re: 光の反射

#25

投稿記事 by telr » 13年前

y1とy2やx1とx2は区別しやすくするために後ろに数字がついているだけなのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#26

投稿記事 by softya(ソフト屋) » 13年前

C言語の理屈で言えば違う値が入っているので変数名が違わないといけません。
手書き式だとしても値が違うものなので何らかの形で名前は変えてやらないとマズイですよね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#27

投稿記事 by telf » 13年前

コード:

#include <stdio.h>
#include <math.h>

int main(){
	int a,b    ;
	int x1=10,y1=50    ; /*一次方程式①のx座標、y座標*/
    int x2=100,y2=130; /*一次方程式①のx座標、y座標*/
	/*連立方程式加減法*/
	/*{y1=a*x1+b*/
    /*{y2=a*x2+b*/
	/*50=10a+b*/
	/*b=10a-50式①*/
	/*130=100a+b*/
	/*b=100a-130式②*/
	/*100a-10a=130-50*/
	/*90a=80*/
	a=80/90;
	b=10*a-50;

	printf("a=%dです。b=%dです。\n",a,b);

	return 0;
}
よれもちがいますよね(きっと

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#28

投稿記事 by softya(ソフト屋) » 13年前

まず、筆算で合っていることを確認してみてください。y=ax+bで計算は合いますか?
あとプログラムは直接数値を書くのではなく、aの式はx1,x2,y1,y2はそのまま式に残してくださいね。

(1)y1=x1*a+b

(2)y2=x2*a+b
ですのでbを消してみましょう。

まず(1)をbの式に変形します。
y1=x1*a+b
 ↓
y1-x1*a=b
 ↓
b=y1-x1*a
はOKですか?
あとは、このbを(2)の式に当てはめてaを求める式に変形するだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#29

投稿記事 by telf » 13年前

最後に投稿したときは、数学的なことに頭が行き過ぎてC言語のこと忘れてました。
もっかいやってみます。

telf

Re: 光の反射

#30

投稿記事 by telf » 13年前

追記
softya(ソフト屋) さんが書きました: y1=x1*a+b
 ↓
y1-x1*a=b
 ↓
b=y1-x1*a
はOKですか?

あとは、このbを(2)の式に当てはめてaを求める式に変形するだけです。
代入方だと、初期化されてないローカル変数がどうしてもでてくるので、無理だと思うのですが?

telf

Re: 光の反射

#31

投稿記事 by telf » 13年前

追記
softya(ソフト屋) さんが書きました: y1=x1*a+b
 ↓
y1-x1*a=b
 ↓
b=y1-x1*a
はOKですか?

あとは、このbを(2)の式に当てはめてaを求める式に変形するだけです。
代入方だと、初期化されてないローカル変数がどうしてもでてくるので、無理だと思うのですが?

telf

Re: 光の反射

#32

投稿記事 by telf » 13年前

操作ミスで、同じものを二回投稿してしまいました。すいません;;

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#33

投稿記事 by softya(ソフト屋) » 13年前

(2)に代入してどうなるか書いてみてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#34

投稿記事 by telf » 13年前

コード:

#include <stdio.h>
#include <math.h>

int main(){
	int a,b    ;
	int x1=10,y1=50    ; /*一次方程式①のx座標、y座標*/
    int x2=100,y2=130; /*一次方程式①のx座標、y座標*/
	/*連立方程式代入法*/
	/*式①
	y1=a*x1+b*/
	b=y1-a*x1;
	/*式②
	y2=a*x2+b
	y2-b=a*x2*/
	a=(y2-b)/x2;

	printf("a=%dです。b=%dです。\n",a,b);

	return 0;
}
こんなかんじでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#35

投稿記事 by softya(ソフト屋) » 13年前

代入法を行うのはあくまで方程式の話でC言語の話ではありません。
(2)に対して(1)の変形式を代入してbを消去した式を作ってみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#36

投稿記事 by telf » 13年前

コード:

#include <stdio.h>
#include <math.h>

int main(){
	double a,b    ;
	int x1=10,y1=50    ; /*一次方程式①のx座標、y座標*/
    int x2=100,y2=130; /*一次方程式①のx座標、y座標*/
	/*連立方程式代入法*/
	/*式①
	y1=a*x1+b*/
	/*b=y1-a*x1;
	/*式②
	y2=a*x2+b
	y2-b=a*x2*/
	/*y2-(y1-a*x1)=a*x2
	y2-y1+a*x1=a*x2
	a*x1-a*x2=-(y2-y1)*/
	a        =-(y2-y1)/(x1-x2);
	b=y1-a*x1;

	printf("a=%4.2fです。b=%4.2fです。\n",a,b);

	return 0;
}
こんな感じでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#37

投稿記事 by softya(ソフト屋) » 13年前

今回の場合は少数以下を計算する必要があるので全ての型をdoubleにしないとマズイです。intが交じると小数点以下が計算されません。
プログラムで検証できるはずのですので検証処理も続いて書いてみてください。x1から求めたy1answerとy1が同じならOKですが違うならなにか間違っています。同様にx2もチェックしてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#38

投稿記事 by telf » 13年前

手書きの数学でやる確認計算みたいなかんじですよね
手書きに連立方程式に確認式もわからないんですけど・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#39

投稿記事 by softya(ソフト屋) » 13年前

telf さんが書きました:手書きの数学でやる確認計算みたいなかんじですよね
手書きに連立方程式に確認式もわからないんですけど・
aとbがもとまっているので直線の方程式であるy=x*a+bの式に当てはめればx1からy1がx2からy2の値が求まります。
ちゃんと求まればaとbは正しいと確認できます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 光の反射

#40

投稿記事 by beatle » 13年前

数式の流れをきれいに書きなおしてみました
suusiki.pdf
(15.72 KiB) ダウンロード数: 195 回

telf

Re: 光の反射

#41

投稿記事 by telf » 13年前

コード:


#include <stdio.h>
#include <math.h>

int main(){
	double a,b    ;
	double x1=10,y1=50    ; /*一次方程式①のx座標、y座標*/
    double x2=100,y2=130; /*一次方程式①のx座標、y座標*/
	/*連立方程式代入法*/
	/*式①
	y1=a*x1+b*/
	/*式②
	y2=a*x2+b*/
	/*bを消す*/
	/*y1-y2=(a*x1-a*x2)
	  y1-y2=a(x1-x2)*/
	a=(y1-y2)/(x1-x2);
	/*①にaを代入*/
	/* y1=a*x1+b */
	 b=y1-a*x1;

     printf("a=%4.2fです。b=%4.2fです。\n",a,b);
     if(y1==a*x1+b){
		  printf("正解\n");
	 }else {
		 printf("不正解\n");
	 }
	 if(y2=a*x2+b){
		 printf("正解\n");
	 }else {
		 printf("不正解\n");
	 }

	return 0;
}
こういうことでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#42

投稿記事 by softya(ソフト屋) » 13年前

実行してみると分かりますが一致しません。これは浮動小数点の計算誤差問題が原因です。[補足]混乱させちゃうので先の書いておくべきでした。
if(y2=a*x2+b){
は比較条件になっていませんので=と==の書き間違いには注意して下さいね。

この場合は人の目で確認したほうが早いです。
printf("y1=%4.2f (a*x1+b)=%4.2f\n",y1,(a*x1+b));
printf("y2=%4.2f (a*x2+b)=%4.2f\n",y2,(a*x2+b));
doubleは誤差を持つと覚えておいて下さい。

じゃあ、前に書いた通りこの直線方程式を使ってy1=0からy1=400まで直線をDrawLineしてみましょう。

【追記】実行しての結果と結果の自分なりの考察もお願いします。なんか実行しているのかいないのか分からないのが気になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#43

投稿記事 by telf » 13年前

softya(ソフト屋) さんが書きました: じゃあ、前に書いた通りこの直線方程式を使ってy1=0からy1=400まで直線をDrawLineしてみましょう。
ってことは、
y1=a*xa+b;
y2=a*x2+b;

の連立ですよね?
また、y以外の変数は前回と同じ数値で連立すればよいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#44

投稿記事 by softya(ソフト屋) » 13年前

telf さんが書きました:
softya(ソフト屋) さんが書きました: じゃあ、前に書いた通りこの直線方程式を使ってy1=0からy1=400まで直線をDrawLineしてみましょう。
ってことは、
y1=a*xa+b;
y2=a*x2+b;

の連立ですよね?
また、y以外の変数は前回と同じ数値で連立すればよいのでしょうか?
名前が分かりづらかったですかね。今回のはlx,lyとしましょう。
今までので既に直線の方程式は求まっていますので、aとbの値はそのまま使います。
double x1=10,y1=50 ; /*一次方程式①のx座標、y座標*/
double x2=100,y2=130; /*一次方程式①のx座標、y座標*/
を通る直線の方程式であるy=a*x+bを使いましょう。
がly1=0とly2=400の時に、それぞれどのlx1,lx2座標を通るか求めるだけです。
後は(lx1,ly1)と(lx2,lx2)の直線を引きます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#45

投稿記事 by telf » 13年前

コード:

#include"DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);

	int Cr=GetColor(255,255,255);

	double a,b    ;
	double x1=10,y1=50    ; /*一次方程式①のx座標、y座標*/
    double x2=100,y2=130; /*一次方程式①のx座標、y座標*/
	/*連立方程式代入法*/
	/*式①
	y1=a*x1+b*/
	/*式②
	y2=a*x2+b*/
	/*bを消す*/
	/*y1-y2=(a*x1-a*x2)
	  y1-y2=a(x1-x2)*/
	a=(y1-y2)/(x1-x2);
	/*①にaを代入*/
	/* y1=a*x1+b */
	 b=y1-a*x1;

	 double ly1=0,ly2=400,lx1,lx2;
	 /*y=a*x+b*/
	 /* y-b=a*x */
	 lx1=(ly1-b)/a;
	 lx2=(ly2-b)/a;

	 // while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
	 while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0  ){
          DrawLine(ly1,ly1,lx2,ly2,Cr);
	 }
	 DxLib_End();
	return 0;
}
処理は正常に行われたのですが、
warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
というのが出ました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#46

投稿記事 by softya(ソフト屋) » 13年前

DrawLineの引数はintですからキャストして下さい。
あと引数が間違っています。よく見なおしてみてください。

基準となる座標点をプロットしてキャストしたもの。間違いはそのまま。

コード:

#include"DxLib.h"
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
 
    int Cr=GetColor(255,255,255);
 
    double a,b    ;
    double x1=10,y1=50    ; /*一次方程式①のx座標、y座標*/
    double x2=100,y2=130; /*一次方程式①のx座標、y座標*/
    /*連立方程式代入法*/
    /*式①
    y1=a*x1+b*/
    /*式②
    y2=a*x2+b*/
    /*bを消す*/
    /*y1-y2=(a*x1-a*x2)
      y1-y2=a(x1-x2)*/
    a=(y1-y2)/(x1-x2);
    /*①にaを代入*/
    /* y1=a*x1+b */
     b=y1-a*x1;
 
     double ly1=0,ly2=400,lx1,lx2;
     /*y=a*x+b*/
     /* y-b=a*x */
     lx1=(ly1-b)/a;
     lx2=(ly2-b)/a;
 
     // while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
     while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0  ){
          DrawLine((int)ly1,(int)ly1,(int)lx2,(int)ly2,Cr);
		  DrawCircle((int)x1,(int)y1,3,GetColor(255,0,0),TRUE);//座標点をプロット
		  DrawCircle((int)x2,(int)y2,3,GetColor(255,0,0),TRUE);//座標点をプロット
     }
     DxLib_End();
    return 0;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#47

投稿記事 by telf » 13年前

softya(ソフト屋) さんが書きました:あと引数が間違っています。よく見なおしてみてください。

基準となる座標点をプロットしてキャストしたもの。間違いはそのまま。

DrawCircle((int)x1,(int)y1,3,GetColor(255,0,0),TRUE);//座標点をプロット
DrawCircle((int)x2,(int)y2,3,GetColor(255,0,0),TRUE);//座標点をプロッ卜
座標点プロットとは、なんでしょうか?
また、引数は計算式が間違ってるのでしょうか?
↑自分では、どこがまちがってるのかわからないです・

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 光の反射

#48

投稿記事 by beatle » 13年前

座標点をプロットするというのは,座標点を描画するという意味です.

telf

Re: 光の反射

#49

投稿記事 by telf » 13年前

コード:

#include"DxLib.h"
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
 
    int Cr=GetColor(255,255,255);
 
    double a,b    ;
    double x1=10,y1=50    ; /*一次方程式①のx座標、y座標*/
    double x2=100,y2=130; /*一次方程式①のx座標、y座標*/
    /*連立方程式代入法*/
    /*式①
    y1=a*x1+b*/
    /*式②
    y2=a*x2+b*/
    /*bを消す*/
    /*y1-y2=(a*x1-a*x2)
      y1-y2=a(x1-x2)*/
    a=(y1-y2)/(x1-x2);
    /*①にaを代入*/
    /* y1=a*x1+b */
     b=y1-a*x1;
 
     double ly1=0,ly2=400,lx1,lx2;
     /*y=a*x+b*/
     /* y-b=a*x */
     lx1=(ly1-b)/a;
     lx2=(ly2-b)/a;
 
     // while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
     while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0  ){
          DrawLine((int)lx1,(int)ly1,(int)lx2,(int)ly2,Cr);
          DrawCircle((int)x1,(int)y1,3,GetColor(255,0,0),TRUE);//座標点をプロット
          DrawCircle((int)x2,(int)y2,3,GetColor(255,0,0),TRUE);//座標点をプロット
     }
     DxLib_End();
    return 0;
}
よく見たら、DrawLineの始点の座標のx座標にly1って打ってました。
修正して、実行したら、点の上をしっかり通りました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#50

投稿記事 by softya(ソフト屋) » 13年前

そうです。そこが問題でした。私の書いた座標プロットで行う様なセルフチェックを行う習慣はゲームを作る上でとても大事です。
自分しか仕様が分かっていないゲームのチェックが出来るのは自分だけだからですね。

さて、続いては鏡の反射ですね。2直線の交点を求めます。

その前に今後のテスト用に直線をサーチライトの様に動かすプログラムも良いかも知れませんが、どちらをやられますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#51

投稿記事 by telf » 13年前

もうすこしわかりやすくいってもらえたらありがたいです。
日本語弱いので><

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#52

投稿記事 by softya(ソフト屋) » 13年前

次の2つを提案しますので選んでみてください。

(1)鏡の反射は、2直線の交点を求めます。
交点については説明済みですね。これを計算するプログラムと仮想の鏡との衝突点を座標プロットして表示します。

(2)ただ反射を表現しても面白みに欠けるので(1)の前に今のプログラムのx2,y2を移動するものに変えてサーチライトのように動くプログラムを作って見ませか?
よりゲームっぽくなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#53

投稿記事 by telf » 13年前

(1)は鏡が自由に動く・・・と前に述べられていたのですが、これは、前後、左右、360度どれでも可能なのでしょうか?
(2)は光がちらついてるイメージでしょうか?
サーチライト=懐中電灯?
(2)の方法でも(1)みたいなことは可能でしょうか?

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 光の反射

#54

投稿記事 by beatle » 13年前

softyaさんが言っているのは,光の反射の交点を求めるという理論的な部分を先に実装するか,動く鏡の絵を描画する部分を先に実装するかという話だと思います.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#55

投稿記事 by softya(ソフト屋) » 13年前

beatleさんの言われる通りで(2)はちょっと遊び心を入れてみましょうって話です。
最終的には(1)をやりますよ、

(1)はい。何処にも動かせるのが目標です。更に両面鏡とか片面鏡とかも区別できる計算方法をお教えすることも出来ます。
(2)光の方向が移動するといったイメージです。懐中電灯で周りを探るといった感じでしょうか。
出来ればC言語の関数化したいのですが関数は学習済みですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#56

投稿記事 by telf » 13年前

softya(ソフト屋) さんが書きました:beatleさんの言われる通りで(2)はちょっと遊び心を入れてみましょうって話です。
最終的には(1)をやりますよ、

(1)はい。何処にも動かせるのが目標です。更に両面鏡とか片面鏡とかも区別できる計算方法をお教えすることも出来ます。
(2)光の方向が移動するといったイメージです。懐中電灯で周りを探るといった感じでしょうか。
出来ればC言語の関数化したいのですが関数は学習済みですか?
ってことは、(1)をやろうが(2)をやろうと、最終的には両方やるってことですね?
それなら、(1)からでもいいです。
関数は学習とは自作関数とか、そういう分野ことでしょうか?
自作関数なら、一応学習しました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#57

投稿記事 by softya(ソフト屋) » 13年前

じゃあ、(1)と言うことで交点の計算をしてみてください。情報は前に出てきています。
鏡の座標はmx1,my1,mx2,my2としましょうか。
とこれも直線の方程式のa,bが欲しいですね。

そうすると・・・。
交点の前に直線の方程式のa,bを求める自作関数を作りましょう。
今のプログラムを改造して、直線の方程式のa,bを求める部分を関数化して下さい。
a,b二つの値を戻すので戻り値を構造体にするか、a,bをポインタ渡しで渡す必要があります。
出来る方でお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#58

投稿記事 by telf » 13年前

[quote="softya(ソフト屋)"]じゃあ、(1)と言うことで交点の計算をしてみてください。情報は前に出てきています。
鏡の座標はmx1,my1,mx2,my2としましょうか。
とこれも直線の方程式のa,bが欲しいですね。

交点の前に直線の方程式のa,bを求める自作関数を作りましょう。
quote]

公式はy=ax+bの連立でいいとして、
x、yの値は、はじめに与えられた、
double x1=10,y1=50
double x2=100,y2=130
を使えばよいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#59

投稿記事 by softya(ソフト屋) » 13年前

x1,x2,y1,y2は引数で受け取って下さい。他のa,bを求める時にも同じ関数を使います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#60

投稿記事 by telf » 13年前

コード:

#include"DxLib.h"

double a,b;
int renritu(double ,double , double , double  );/*プロトタイプ宣言*/


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);

    double x1=10,y1=50    ; /*一次方程式①のx座標、y座標*/
    double x2=100,y2=130; /*一次方程式①のx座標、y座標*/
    double ly1=0,ly2=400,lx1,lx2;
    int Cr=GetColor(255,255,255);

    renritu(x1,y1,x2,y2);
	
     /*y=a*x+b*/
     /* y-b=a*x */
	 lx1=(ly1-b)/a; 
	 lx2=(ly2-b)/a; 

     // while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
     while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0  ){
          DrawLine((int)lx1,(int)ly1,(int)lx2,(int)ly2,Cr);
          DrawCircle((int)x1,(int)y1,3,GetColor(255,0,0),TRUE);//座標点をプロット
          DrawCircle((int)x2,(int)y2,3,GetColor(255,0,0),TRUE);//座標点をプロット
	 }

     DxLib_End();
    return 0;
}

int renritu(double x1,double y1, double x2, double y2 ){   /* a,bの値を計算する関数*/
	a=(y1-y2)/(x1-x2);
	b=y1-a*x1;
	return 0;

}
必ずポインタか構造体でやらないとダメなのでしょうか?
上のでは、ダメでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#61

投稿記事 by softya(ソフト屋) » 13年前

telf さんが書きました:必ずポインタか構造体でやらないとダメなのでしょうか?
なぜなら別の直線の方程式を求める時に困るからです。
次の交点を求めるときに、もう一つ別のa,bを求めてみようって話になりますので使いやすいように組みましょう。

それと関数名はrenritu()では無くchokusen_no_houteisiki()の方が良いと思います。より意味的に正しい名前を使いましょう。
ちなみに英語で書くとLinear_equation()です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#62

投稿記事 by telf » 13年前

いろいろ、調べてやってみたのですが、イマイチやり方がわからないので、
参考になるような、ヒントか何かをわかりやすく教えてくれるとありがたいです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#63

投稿記事 by softya(ソフト屋) » 13年前

具体的に何が分からないのでしょうか?
構造体を戻り値とする方法でしょうか?

● 構造体の引数と戻り値
「4.2.6.3 関数からの戻り値」
http://www.kiso.tsukuba.ac.jp/~makimura ... ode77.html

それとも構造体自体の宣言の方法でしょうか?

[補足] なぜ、こういう聞き方をするかというと具体的な質問には具体的な答えを返せますが、曖昧なものには曖昧な答えしか返せないからです。
なので出来るだけ具体的な質問をしてもらうと的確な答えが返せると思います。
プログラムを組むということは明確にやること意識して曖昧なことを無くすということですので、具体的な質問を考えることはプログラムを組むことのよい訓練にもなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#64

投稿記事 by telf » 13年前

構造体の宣言は、わかるのですが、
構造体を使って自作関数からメイン関数へ引数を返す方法がわからないのです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#65

投稿記事 by softya(ソフト屋) » 13年前

telf さんが書きました:構造体の宣言は、わかるのですが、
構造体を使って自作関数からメイン関数へ引数を返す方法がわからないのです。
そうです。そう言う風に疑問を具体的にすることが大事です。
私はtelfさんの理解レベルがわかりませんので具体的に聞いてもらうのがベストです。
参考サイトは見てもらえましたか?
引数と戻り値で構造体を使っていますね。

まず、戻り値はreturnに書かれた値が関数の呼びだし元の変数に代入されると覚えて下さい。
a = func();
のaの値は関数が次のような場合

コード:

int  func()
{
    return 1;
}
でaに1が入ります。
これが構造体でも同様です。
return 構造体変数1;
とすれば
構造体変数2 = func();
で構造体変数1の内容は構造体変数2に代入されます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#66

投稿記事 by telf » 13年前

コード:

#include"DxLib.h"
 struct chokusen {
	 double a;
	 double b;
	 double x1;
	 double y1;
	 double x2;
	 double y2;
 };
 int chokusen_no_housiki();
 
/*int chokusen_no_houteisiki(double,double,double,double );/*プロトタイプ宣言*/
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
    double x1=10,y1=50    ; /*一次方程式①のx座標、y座標*/
    double x2=100,y2=130; /*一次方程式①のx座標、y座標*/
    double ly1=0,ly2=400,lx1,lx2;
    int Cr=GetColor(255,255,255);
    a=chokusen_no_housiki();
    
     /*y=a*x+b*/
     /* y-b=a*x */
   lx1=(ly1-b)/a; 
     lx2=(ly2-b)/a; 
 
     // while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
     while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0  ){
          DrawLine((int)lx1,(int)ly1,(int)lx2,(int)ly2,Cr);
          DrawCircle((int)x1,(int)y1,3,GetColor(255,0,0),TRUE);//座標点をプロット
          DrawCircle((int)x2,(int)y2,3,GetColor(255,0,0),TRUE);//座標点をプロット
     }
 
     DxLib_End();
    return 0;
}
 
int  chokusen_no_housiki()
{

   struct chokusen ret;
   struct chokusen p;
 
	ret.a=(p.y1-p.y2)/(p.x1-p.x2);
	ret.b=p.y1-p.a*p.x1;

	return ret;
}
こんな感じでしょうか?
↑のコードは、未完成なので、どう修正すればようでしょうか?

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 光の反射

#67

投稿記事 by beatle » 13年前

chokusen_no_housikiは恐らくchokusen_no_houteisikiですよね.「方程式」
まあ,そんな細かいことはおいといて...

関数の定義の基本は以下です

コード:

戻り値の型 関数名( 引数リスト )
{
    return 戻り値;
}
今回,struct chokusen型の変数retを戻り値にしたいということですから,戻り値の型は「struct chokusen」とする必要があります.telfさんが示したソースコードでは,chokusen_no_housikiの戻り値がintですので,整数1つしか返せません.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#68

投稿記事 by softya(ソフト屋) » 13年前

戻り値と引数は構造体を分けたほうが良いと思います。

コード:

struct ValueAB {
	double a;
	double b;
};
strcut PointXY {
	double x;
	double y;
};
などを使われてはどうでしょうか?

それと構造体変数の受け渡しや受け取りができてません。
beatleさんの書かれた事に注意して組み直してみてください。

これらは全て構造体変数になりますので値を初期化後、関数の引数として下さい。

コード:

    double x1=10,y1=50    ; /*一次方程式①のx座標、y座標*/
    double x2=100,y2=130; /*一次方程式①のx座標、y座標*/
同様にこれらのa,bは戻り値として代入された構造体変数を使わなくてはいけません。

コード:

   lx1=(ly1-b)/a; 
     lx2=(ly2-b)/a; 
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telf

Re: 光の反射

#69

投稿記事 by telf » 13年前

chokusen housiki(PointXY p)
Error; 関数housikiは不完全型chokusenを返します。
と出ます。
これは、どう直せば良いのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 光の反射

#70

投稿記事 by softya(ソフト屋) » 13年前

プログラム全体を掲載して下さい。

定義次第ですが、
struct chokusen housiki(struct PointXY p)
ではないでしょうか?
struct chokusenとstruct PointXYが定義されているという前提となります。
あとhousikiはbeatleさんが指摘されております。

自作関数や構造体の知識がかなり曖昧なので、一度C言語の教科書を見なおされたほうが良いかと思います。

↓ こちらでもよろしいですが。
「苦しんで覚えるC言語」
http://9cguide.appspot.com/
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 光の反射

#71

投稿記事 by beatle » 13年前

C言語では構造体定義は次のようになります.

コード:

struct TagName
{
    int hoge;
};
TagNameは型名ではなくて「構造体タグ名」と呼ばれるものです.型として使う場合,structを省略できないのです.「struct TagName」で一つの型になる,と考えればOKです.

ちなみに,typedefを使って以下のように定義すると,TypeNameが型名として使えるようになります.

コード:

typedef struct TagName
{
    int hoge;
} TypeName;
参考までに,typedefの構文は

コード:

typedef  既存の型名  別名;
です.

閉鎖

“C言語何でも質問掲示板” へ戻る