ページ 11

垂線による座標判別について質問です。

Posted: 2015年12月20日(日) 00:37
by 桜餅(拡散型)
画像のように、ランダムに点をだし、一番上と一番右を判別させます。
そこからその間を結んだ線より一番垂線の長い点を見つけます。
ただし、その点が垂線より右上でなければならない。
という条件で座標を取得したいのですが、中々うまく行きません…
よろしくお願い致します。
説明が中々上手くできなくて申し訳ないです…
画像↓
http://fast-uploader.com/file/7006093549267/

コード:

#define MAX 5
int main(){
	double X[MAX], Y[MAX], X2[MAX], Y2[MAX], X3, Y3;
	double a, b, c, d, temp, tx, ty, t;
	int i, j, Flag;

	//座標の乱数
	srand((unsigned int)time(NULL));
	for (i = 0; i < MAX; i++){
		X[i] = (double)(rand() % 101 - 50) / 50;
		Y[i] = (double)(rand() % 101 - 50) / 50;
	}

	//X軸にソート
	for (i = 0; i < MAX - 1; i++) {
		for (j = MAX - 1; j > i; j--) {
			if (X[j - 1] > X[j]) {
				temp = X[j];
				X[j] = X[j - 1];
				X[j - 1] = temp;

				temp = Y[j];
				Y[j] = Y[j - 1];
				Y[j - 1] = temp;
			}
		}
	}

	//Xにおける最大と最小を取得
	X2[0] = X[0];	Y2[0] = Y[0];
	X2[2] = X[MAX - 1];	Y2[2] = Y[MAX - 1];

	//Y軸にソート
	for (i = 0; i < MAX - 1; i++) {
		for (j = MAX - 1; j > i; j--) {
			if (Y[j - 1] > Y[j]) {
				temp = Y[j];
				Y[j] = Y[j - 1];
				Y[j - 1] = temp;

				temp = X[j];
				X[j] = X[j - 1];
				X[j - 1] = temp;
			}
		}
	}
	//Yにおける最大と最小を取得
	X2[1] = X[0];	Y2[1] = Y[0];
	X2[3] = X[MAX - 1];	Y2[3] = Y[MAX - 1];

	//ax+by+c=0を求める
	a = (Y2[3] - Y2[2]);
	b = -1 * (X2[3] - Y2[2]);
	c = Y2[3] * (X2[3] - X2[2]) - X2[3] * (Y2[3] - Y2[2]);

	//必要要素を代入
	temp = 0;
	Flag = 0;
	for (i = 0; i < MAX; i++){
		d = abs(a*X[i] + b*Y[i] + c) / sqrt(a*a + b*b);	//垂線の長さ
		//垂線の足を求め必要要素を選択する。
		t = (a*X[i] + b*Y[i] + c) / (a*a + b*b);
		tx = X[i] - t*a;
		ty = Y[i] - t*b;
		if (tx < X[i] && ty < Y[i]){
			if (temp <= d){
				X3 = X[i];	Y3 = Y[i];
				Flag = 1;
				temp = d;
			}
		}
	}
	
	//表示
	printf("%f , %f",X2[3], Y2[3]);
	printf("%f , %f",X2[2], Y2[2]);
	if (Flag == 1){
		printf("%f , %f",X3, Y3);
	}
}

Re: 垂線による座標判別について質問です。

Posted: 2015年12月20日(日) 19:20
by たいちう
> 説明が中々上手くできなくて申し訳ないです…

画像を見ても何を言っているのか全く分かりません。
何とか説明してもらわないと協力しようがないのでは?

Re: 垂線による座標判別について質問です。

Posted: 2015年12月20日(日) 23:23
by 桜餅(拡散型)
画像はまず上下別の物と考えて下さい。
X軸上に1番右にある点aと、Y軸上に一番上の点b(上下共に青く囲っている部分)を保存します。
a-b間に直線を引いた時、画像上のように、他の点から降ろす垂線の長さが最も長く、右上に存在する座標を保存したいのです。
逆に、画像下のように右上に何も存在しない場合、はaとbだけ保存したいのです。

Re: 垂線による座標判別について質問です。

Posted: 2015年12月21日(月) 09:22
by usao
オフトピック
「一番上」と「一番右」が同じ点だったらどうするんだろう…?
要するに,
直線a-bの単位法線ベクトルN(「右上」向き)に関して
(P-a) と N との内積が最大(で且つ正の値)になるような点Pを見つければいいという話?