Решение на (Floating) Points and Vectors от Петко Георгиев

Обратно към всички решения

Към профила на Петко Георгиев

Резултати

  • 20 точки от тестове
  • 0 бонус точки
  • 20 точки общо
  • 15 успешни тест(а)
  • 0 неуспешни тест(а)

Код

use std::ops::Add;
use std::ops::Sub;
use std::ops::Mul;
use std::ops::BitXor;
macro_rules! f64_eq {
( $x:expr, $y:expr ) => {
($x - $y).abs() < std::f64::EPSILON
}
}
#[derive(Debug, Clone, Copy)]
pub struct Point {
x: f64,
y: f64,
z: f64,
}
impl Point {
pub fn new(x: f64, y: f64, z: f64) -> Self {
Point { x, y, z }
}
}
impl PartialEq for Point {
fn eq(&self, other: &Point) -> bool {
f64_eq!(self.x, other.x) &&
f64_eq!(self.y, other.y) &&
f64_eq!(self.z, other.z)
}
}
impl Add<Vector> for Point {
type Output = Point;
fn add(self, other: Vector) -> Point {
Point {
x: self.x + other.x,
y: self.y + other.y,
z: self.z + other.z,
}
}
}
impl Sub for Point {
type Output = Vector;
fn sub(self, other: Point) -> Vector {
Vector {
x: self.x - other.x,
y: self.y - other.y,
z: self.z - other.z,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct Vector {
x: f64,
y: f64,
z: f64,
}
impl Vector {
pub fn new(x: f64, y: f64, z: f64) -> Self {
Vector { x, y, z }
}
pub fn is_zero(&self) -> bool {
f64_eq!(self.x, 0.0) && f64_eq!(self.y, 0.0) && f64_eq!(self.z, 0.0)
}
}
impl PartialEq for Vector {
fn eq(&self, other: &Vector) -> bool {
f64_eq!(self.x, other.x) &&
f64_eq!(self.y, other.y) &&
f64_eq!(self.z, other.z)
}
}
impl Add for Vector {
type Output = Vector;
fn add(self, other: Vector) -> Vector {
Vector {
x: self.x + other.x,
y: self.y + other.y,
z: self.z + other.z,
}
}
}
impl Mul<Vector> for f64 {
type Output = Vector;
fn mul(self, v: Vector) -> Vector {
Vector {
x: self * v.x,
y: self * v.y,
z: self * v.z,
}
}
}
impl Mul for Vector {
type Output = f64;
fn mul(self, other: Vector) -> f64 {
self.x * other.x +
self.y * other.y +
self.z * other.z
}
}
impl BitXor for Vector {
type Output = Vector;
fn bitxor(self, other: Vector) -> Vector {
Vector {
x: self.y * other.z - self.z * other.y,
y: self.z * other.x - self.x * other.z,
z: self.x * other.y - self.y * other.x,
}
}
}
#[derive(Debug)]
pub struct Line {
p: Point,
v: Vector,
}
impl Line {
pub fn from_pp(p1: Point, p2: Point) -> Option<Self> {
if p1 == p2 {
None
} else {
Some(Line {
p: p1,
v: p2 - p1,
})
}
}
pub fn from_pv(p: Point, v: Vector) -> Option<Self> {
if f64_eq!(v.x, 0.0) && f64_eq!(v.y, 0.0) && f64_eq!(v.z, 0.0) {
None
} else {
Some(Line { p, v })
}
}
pub fn distance(&self, target: Point) -> f64 {
let cp = (target - self.p) ^ self.v;
((cp.x * cp.x + cp.y * cp.y + cp.z * cp.z) /
(self.v.x * self.v.x + self.v.y * self.v.y + self.v.z * self.v.z)).sqrt()
}
}
impl PartialEq for Line {
fn eq(&self, other: &Line) -> bool {
(self.v ^ other.v).is_zero() && (self.v ^ (other.p - self.p)).is_zero()
}
}

Лог от изпълнението

Compiling solution v0.1.0 (/tmp/d20190123-22631-1lv26oy/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 4.99s
     Running target/debug/deps/solution-2e785d603b538f71

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/solution_test-29808948fb50ed3a

running 15 tests
test solution_test::test_equailty_symmetry ... ok
test solution_test::test_equality_basic ... ok
test solution_test::test_equality_floating ... ok
test solution_test::test_line_constructors ... ok
test solution_test::test_line_equality_by_points ... ok
test solution_test::test_line_equality_by_points_and_vectors ... ok
test solution_test::test_line_equality_by_vectors ... ok
test solution_test::test_line_validity ... ok
test solution_test::test_number_by_vector ... ok
test solution_test::test_number_vector_multiplication_with_precision ... ok
test solution_test::test_point_distance ... ok
test solution_test::test_points_minus_points ... ok
test solution_test::test_points_plus_vectors ... ok
test solution_test::test_vector_by_vector ... ok
test solution_test::test_vector_by_vector_cross ... ok

test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests solution

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

История (1 версия и 1 коментар)

Петко качи първо решение на 24.11.2018 13:55 (преди почти 7 години)

Подозирам, че може да има проблем с точността на някоя операция. Ще огледам решението ти като намеря време и може да адаптирам тестовете да ги направя по-permissive за липсващата ти точка (стига това да е причината).