Решение на (Floating) Points and Vectors от Димитър Иринков

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

Към профила на Димитър Иринков

Резултати

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

Код

use std::ops::{Add, Sub, Mul, BitXor};
#[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}
}
}
#[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}
}
}
impl PartialEq for Vector {
fn eq(&self, other: &Vector) -> bool {
((self.x - other.x).abs() < std::f64::EPSILON) &&
((self.y - other.y).abs() < std::f64::EPSILON) &&
((self.z - other.z).abs() < std::f64::EPSILON)
}
}
impl PartialEq for Point {
fn eq(&self, other: &Point) -> bool {
((self.x - other.x).abs() < std::f64::EPSILON) &&
((self.y - other.y).abs() < std::f64::EPSILON) &&
((self.z - other.z).abs() < std::f64::EPSILON)
}
}
impl Add<Vector> for Point {
type Output = Self;
fn add(self, rhs: Vector) -> Self {
Point {
x: self.x + rhs.x ,
y: self.y + rhs.y ,
z: self.z + rhs.z ,
}
}
}
impl Sub for Point {
type Output = Vector;
fn sub(self, rhs: Point) -> Vector {
Vector {
x: self.x - rhs.x ,
y: self.y - rhs.y ,
z: self.z - rhs.z ,
}
}
}
impl Add for Vector {
type Output = Vector;
fn add(self, rhs: Vector) -> Vector {
Vector {
x: self.x + rhs.x ,
y: self.y + rhs.y ,
z: self.z + rhs.z ,
}
}
}
impl Mul for Vector {
type Output = f64;
fn mul(self, rhs: Vector) -> f64 {
self.x * rhs.x + self.y * rhs.y + self.z * rhs.z
}
}
impl Mul<Vector> for f64 {
type Output = Vector;
fn mul(self, rhs: Vector) -> Vector {
Vector {
x: self * rhs.x ,
y: self * rhs.y ,
z: self * rhs.z ,
}
}
}
impl BitXor for Vector {
type Output = Vector;
fn bitxor(self, rhs: Vector) -> Vector {
Vector {
x: self.y * rhs.z - self.z * rhs.y ,
y: self.z * rhs.x - self.x * rhs.z ,
z: self.x * rhs.y - self.y * rhs.x ,
}
}
}
#[derive(Debug)]
pub struct Line {
norm : Vector ,
p : Point ,

Малко неконсистентен naming. Ако p ти беше точката, можеше v да ти е вектора. Аз лично съм ги кръстил origin и direction, но при всички положения, norm е малко странно име, предвид, че вектора не е нормиран (т.е. не е scale-нат, така че дължината му да е 1).

}
impl Line {
pub fn from_pp(p1: Point, p2: Point) -> Option<Self> {
if p1 == p2 {
None
} else {
Some(Line {
norm : p2 - p1,
p : p1
})
}
}
pub fn from_pv(p: Point, v: Vector) -> Option<Self> {
if v == (Vector{ x : 0_f64 , y : 0_f64 , z : 0_f64}) {
None
} else {
Some(Line {
norm : v ,
p : p ,
})
}
}
}
pub fn vector_lenght(v : Vector) -> f64 {
(v.x.powi(2) + v.y.powi(2) + v.z.powi(2)).sqrt()
}
impl Line {
pub fn distance(&self, target: Point) -> f64 {
vector_lenght(Vector{
x : target.x - self.p.x ,
y : target.y - self.p.y ,
z : target.z - self.p.z ,
} ^ self.norm) / vector_lenght(self.norm)
}
}
impl PartialEq for Line {
fn eq(&self, other: &Line) -> bool {
let dis1 = self.distance(other.p);
let dis2 = self.distance(other.p + other.norm);
if dis1 < std::f64::EPSILON &&
dis2 < std::f64::EPSILON {
true
}
else {
false
}
}
}

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

Compiling solution v0.1.0 (/tmp/d20190123-22631-pk53tu/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 5.12s
     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 версия и 3 коментара)