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