fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. // 構造体の定義
  5. typedef struct {
  6. int x;
  7. int y;
  8. } Point;
  9.  
  10. // 距離計算関数
  11. double distance(Point p1, Point p2) {
  12. return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
  13. }
  14.  
  15. // 点Aと線分BCの最短距離を計算する関数
  16. double shortestDistance(Point A, Point B, Point C) {
  17. // ベクトルの定義
  18. double ABx = B.x - A.x;
  19. double ABy = B.y - A.y;
  20. double BCx = C.x - B.x;
  21. double BCy = C.y - B.y;
  22.  
  23. // 線分BCの長さ
  24. double BC_length = distance(B, C);
  25. if (BC_length == 0) return distance(A, B); // BとCが同じ点の場合
  26.  
  27. // 線分BCに対する点Aの投影位置を計算
  28. double t = (ABx * BCx + ABy * BCy) / (BC_length * BC_length);
  29.  
  30. if (t < 0) {
  31. // プロジェクションが線分BCの外側(点Bに近い)
  32. return distance(A, B);
  33. } else if (t > 1) {
  34. // プロジェクションが線分BCの外側(点Cに近い)
  35. return distance(A, C);
  36. } else {
  37. // プロジェクションが線分BCの内側
  38. Point projection = { B.x + t * BCx, B.y + t * BCy };
  39. return distance(A, projection);
  40. }
  41. }
  42.  
  43. int main() {
  44. Point A, B, C;
  45.  
  46. // ユーザーからの入力
  47. printf("点Aの座標を入力してください (x y): ");
  48. scanf("%d %d", &A.x, &A.y);
  49. printf("点Bの座標を入力してください (x y): ");
  50. scanf("%d %d", &B.x, &B.y);
  51. printf("点Cの座標を入力してください (x y): ");
  52. scanf("%d %d", &C.x, &C.y);
  53.  
  54. // 最短距離の計算
  55. double distance = shortestDistance(A, B, C);
  56. printf("点Aと線分BCの最短距離は: %.2f\n", distance);
  57.  
  58. return 0;
  59. }
  60.  
Success #stdin #stdout 0s 5268KB
stdin
3 4 1 1 5 1
stdout
点Aの座標を入力してください (x y): 点Bの座標を入力してください (x y): 点Cの座標を入力してください (x y): 点Aと線分BCの最短距離は: 3.61