Menu
Coddy logo textTech

復習 - 座標点

CoddyのRustジャーニー「Object Oriented Programming」セクションの一部 — レッスン 28/61。

challenge icon

チャレンジ

簡単

あらゆる数値型で動作する柔軟な座標システムを構築しましょう!グリッドベースのゲーム用の整数や、精密なグラフィックス用の浮動小数点数を使用して位置を表現できる、ジェネリックな Point 構造体を単一の定義から作成します。

コードを2つのファイルに分けて構成します:

  • point.rs: 2つの公開フィールド xy(どちらも T 型)を持つ、公開ジェネリック構造体 Point<T> を定義します。ポイントのためのメソッドを実装してください:
    • x 座標と y 座標からポイントを作成する new 関連関数
    • dx と dy の値を受け取り、それらの量だけシフトされた座標を持つ新しい Point を返す translate メソッド(これには T が加算とコピーをサポートしている必要があるため、トレイト境界 T: std::ops::Add<Output = T> + Copy を使用してください)
  • main.rs: point モジュールを取り込み、同じジェネリック構造体が異なる数値型でシームレスに動作することを示します。

メインファイルで、以下の手順でジェネリックな Point を実演してください:

  1. 最初の2つの入力(i32 としてパース)を使用して整数のポイントを作成する
  2. 3番目と4番目の入力(同じく i32)を使用してそれを移動(translate)させる
  3. 5番目と6番目の入力(f64 としてパース)を使用して浮動小数点数のポイントを作成する
  4. 3つすべてのポイントを表示する

出力は以下の形式に従う必要があります:

Integer point: ({x}, {y})
After translation: ({x}, {y})
Float point: ({x}, {y})

例えば、入力が 3, 5, 2, -1, 1.5, 2.5 の場合:

Integer point: (3, 5)
After translation: (5, 4)
Float point: (1.5, 2.5)

Point::new(3, 5)Point<i32> を作成する一方で、Point::new(1.5, 2.5)Point<f64> を作成することに注目してください。同じ構造体定義が両方に適応します!

6つの入力を受け取ります:最初のポイントのための2つの整数、移動のための2つの整数、そして2番目のポイントのための2つの浮動小数点数です。

自分で試してみよう

mod point;

use point::Point;

fn main() {
    // 入力を読み込む
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let x1: i32 = input.trim().parse().expect("Invalid input");
    
    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let y1: i32 = input.trim().parse().expect("Invalid input");
    
    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let dx: i32 = input.trim().parse().expect("Invalid input");
    
    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let dy: i32 = input.trim().parse().expect("Invalid input");
    
    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let x2: f64 = input.trim().parse().expect("Invalid input");
    
    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let y2: f64 = input.trim().parse().expect("Invalid input");
    
    // TODO: x1 と y1 を使用して整数の点を作成する
    
    // TODO: 整数の点を dx と dy で平行移動させる
    
    // TODO: x2 と y2 を使用して浮動小数点の点を作成する
    
    // TODO: 必要な形式で結果を出力する:
    // println!("Integer point: ({}, {})", ...);
    // println!("After translation: ({}, {})", ...);
    // println!("Float point: ({}, {})", ...);
}

Object Oriented Programmingのすべてのレッスン