Перейти к содержимому

Уроки · 19

Расстояние

В уроке «Смещение» мы вычитали координату из координаты, чтобы узнать, насколько сдвинуться. Сейчас пойдём чуть дальше: разница по x и разница по y вместе превращаются в одно число — расстояние между двумя точками.

Замени содержимое src/main.rs на это:

src/main.rs
use macroquad::prelude::*;
#[macroquad::main("Расстояние")]
async fn main() {
loop {
clear_background(BLACK);
// Центр экрана.
let center_x = screen_width() / 2.0;
let center_y = screen_height() / 2.0;
// Координаты курсора.
let (mouse_x, mouse_y) = mouse_position();
// Разница по x между курсором и центром.
let dx = mouse_x - center_x;
// Разница по y между курсором и центром.
let dy = mouse_y - center_y;
// Квадрат расстояния — сумма квадратов разниц по x и по y.
let squared_distance = dx * dx + dy * dy;
// Само расстояние — квадратный корень из squared_distance.
let distance = squared_distance.sqrt();
// draw_circle_lines — то же самое, что draw_circle, только
// рисует контур, а не сплошную заливку.
draw_circle_lines(center_x, center_y, distance, 3.0, YELLOW);
// Белая точка — курсор, чтобы видно было, что контур касается
// его ровно в этой точке.
draw_circle(mouse_x, mouse_y, 8.0, WHITE);
next_frame().await;
}
}

Запусти как обычно:

Окно терминала
cargo run

Двигай мышь — контур растёт и сжимается вслед за курсором, но всегда проходит ровно через него. Попробуй прямо здесь:

  • dx и dy — разница по каждой оси между курсором и центром, тем же способом, что и в “Смещении”.
  • dx * dx и dy * dy — возведение в квадрат. Оно заодно убирает минус: неважно, слева мышь от центра или справа, разница “в квадрате” всегда получается положительной.
  • .sqrt() — квадратный корень, действие, обратное возведению в квадрат. Складываем оба квадрата и достаём из суммы корень — и получаем настоящее расстояние в пикселях. У этого способа считать расстояние есть своё название — теорема Пифагора; откуда она берётся и почему вообще верна — в дополнительном уроке «Теорема Пифагора».
  • Раз distance — это и есть расстояние от центра до курсора, его можно напрямую использовать как радиус: контур круга с таким радиусом обязательно пройдёт через точку, из которой это расстояние считали.