Решение на (Floating) Points and Vectors от Томислав Николов
Към профила на Томислав Николов
Резултати
- 16 точки от тестове
- 0 бонус точки
- 16 точки общо
- 12 успешни тест(а)
- 3 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20190123-22631-1vbp52a/solution)
Finished dev [unoptimized + debuginfo] target(s) in 5.45s
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 ... FAILED
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 ... FAILED
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 ... FAILED
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
failures:
---- solution_test::test_line_constructors stdout ----
thread 'solution_test::test_line_constructors' panicked at 'assertion failed: `(left != right)`
left: `Some(Line { lx: 1.0, ly: 1.0, lz: 1.0, po: Point { px: 0.0, py: 0.0, pz: 0.0 }, ve: Vector { vx: 1.0, vy: 1.0, vz: 1.0 } })`,
right: `Some(Line { lx: 1.0, ly: -1.0, lz: 1.0, po: Point { px: 0.0, py: 0.0, pz: 0.0 }, ve: Vector { vx: 1.0, vy: -1.0, vz: 1.0 } })`', tests/solution_test.rs:165:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.
---- solution_test::test_line_equality_by_vectors stdout ----
thread 'solution_test::test_line_equality_by_vectors' panicked at 'assertion failed: `(left == right)`
left: `Some(Line { lx: 0.1, ly: 0.2, lz: 0.5, po: Point { px: 0.0, py: 0.4, pz: 0.0 }, ve: Vector { vx: 0.1, vy: -0.2, vz: 0.5 } })`,
right: `Some(Line { lx: 0.2, ly: 0.0, lz: 1.0, po: Point { px: 0.0, py: 0.4, pz: 0.0 }, ve: Vector { vx: 0.2, vy: -0.4, vz: 1.0 } })`', tests/solution_test.rs:226:5
---- solution_test::test_point_distance stdout ----
thread 'solution_test::test_point_distance' panicked at 'assertion failed: (line.distance(p1) - 2.0f64.sqrt() / 2.0).abs() < EPS * 1000.0', tests/solution_test.rs:183:5
failures:
solution_test::test_line_constructors
solution_test::test_line_equality_by_vectors
solution_test::test_point_distance
test result: FAILED. 12 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out
error: test failed, to rerun pass '--test solution_test'
История (3 версии и 5 коментара)
Томислав качи решение на 25.11.2018 14:47 (преди около 7 години)
ax + by + cz + d = 0 не е уравнение на права. Това е уравнение на равнина в тримерното пространство. И за нея, a, b, c, d, са параметрите, които дефинират равнината, а не x, y, z.
Предполагам, че ти липсват някакви познания по геометрия, но единственото, което мога да ти препоръчам, е да прочетеш внимателно условието и да прочетеш обстойно линковете от уикипедия, може би дори да погугълнеш малко допълнително, за да си изясниш формулите.
Томислав качи решение на 25.11.2018 21:23 (преди почти 7 години)
Логиката тук ми е странно да я проследя. Единственото, което използваш тук за сравнение, е lx-y-z, което са координатите на точка на линията. Изваждаш ratio-тата на тази точка? Не знам каква формула си се опитал да имплементираш, но няма как да можеш да определиш еднаквост на две тримерни линии само от координатите на една точка, лежаща на всяка.
Освен това, можеше вместо три float-а, да запазиш втората точка?
Деленето тук е грешно. Във формулата в wikipedia се делят дължините на векторите (vector norm). Реално, делението, което ти си имплементирал върху вектори, не съществува като операция -- то е "скаларно произведение с реципрочния вектор", но не върши работа за много неща. Ако имаше метод len, който да връща дължината на един вектор (корен квадратен от сумата на квадратите на координатите му), щеше да сработи този метод с ((to_target ^ self.ve).len()/self.ve.len())
Може да пробваш да си начертаеш една-две прави с прости координати и да пробваш какво ще ти върне този код за тях. Скоро ще публикувам и пълния тест на същото място, на което е базовия, така че refresh-вай репо-то.
Всъщност, ето теста: https://github.com/fmi/rust-homework/blob/master/02/test_full.rs

Не става въпрос за двумерни линии, а за тримерни. Затова се конструират с тримерни точки и вектори. Да вземеш само
xиyстойностите fail-ва повечето line тестове.Логиката тук ми е странно да я проследя. Единственото, което използваш тук за сравнение, е
lx-y-z, което са координатите на точка на линията. Изваждаш ratio-тата на тази точка? Не знам каква формула си се опитал да имплементираш, но няма как да можеш да определиш еднаквост на две тримерни линии само от координатите на една точка, лежаща на всяка.Освен това, можеше вместо три float-а, да запазиш втората точка?
Деленето тук е грешно. Във формулата в wikipedia се делят дължините на векторите (vector norm). Реално, делението, което ти си имплементирал върху вектори, не съществува като операция -- то е "скаларно произведение с реципрочния вектор", но не върши работа за много неща. Ако имаше метод
len, който да връща дължината на един вектор (корен квадратен от сумата на квадратите на координатите му), щеше да сработи този метод с((to_target ^ self.ve).len()/self.ve.len())Може да пробваш да си начертаеш една-две прави с прости координати и да пробваш какво ще ти върне този код за тях. Скоро ще публикувам и пълния тест на същото място, на което е базовия, така че refresh-вай репо-то.
Всъщност, ето теста: https://github.com/fmi/rust-homework/blob/master/02/test_full.rs