私は行 L と言う行を持っていますlx + my + n = 0
。ここで、いくつかの K ポイントが与えられた場合、ライン L 上の xy 平面上で、またはそうでない場合、 X と「N」ポイント間の距離の合計が最小になるよう(x1,y1),(x2, y2)...(xk,yk)
に、ライン L 上のポイントを見つけたいとします。(x0,y0)
そんな疑問を解決するアルゴリズムとは。最初に、各点から線 L に垂直な点の座標を見つける解決策を考えました(x1,y1),(x2, y2)...(xk,yk)
。次に、垂線が線 L と交わるすべての点の平均点を見つけて、最小点を見つけました。しかし、そのようなアプローチは間違っています。問題を解決するための正しい方法を提案してください。これが私のコードです
#include <stdio.h>
#include <math.h>
typedef struct
{
int x;
int y;
}point;
double distance(point * A, double x, double y)
{
return sqrt(pow(A->x - x, 2) + pow(A->y - y, 2));
}
int main()
{
int i = 0 , j = 0, test = 0, number_of_warehouse = 0, A = 0, B = 0, C = 0;
point * point_array , *closest_points, sum;
double avgx = 0.0, avgy = 0.0, Total_dist = 0.0;
scanf("%d", &test);
while (test--)
{
scanf("%d", &number_of_warehouse);
point_array = malloc (sizeof(point) * number_of_warehouse);
closest_points = malloc (sizeof(point) * number_of_warehouse);
scanf("%d%d%d", &A, &B,&C);
sum.x = 0;
sum.y = 0;
avgx = 0;
avgy = 0;
for(i = 0; i < number_of_warehouse; ++i)
{
scanf("%d%d", &(point_array[i].x), &(point_array[i].y));
closest_points[i].x = (B*(B * point_array[i].x - A * point_array[i].y) - A *C)/ (A*A + B*B);
closest_points[i].y = (A*((-1)* B * point_array[i].x + A * point_array[i].y) - B *C)/ (A*A + B*B);
sum.x += closest_points[i].x;
sum.y += closest_points[i].y;
}
Total_dist = 0.0;
avgx = sum.x / number_of_warehouse;
avgy = sum.y / number_of_warehouse;
for(i = 0; i < number_of_warehouse; ++i)
{
Total_dist += distance(point_array + i, avgx, avgy);
}
printf("%.6f", Total_dist);
}
return 0;
}