feo_math/multivariate/
two_unknown.rs1use core::fmt;
2use std::ops::{Add, Div, Mul, Sub};
3
4use crate::Zero;
5
6use super::with_var::WithVar;
7use super::one_unknown::Equa1;
8
9
10#[derive(Clone, Copy)]
11pub(crate) struct Equa2<T>(pub T, pub WithVar<T>, pub WithVar<T>);
12
13impl<T> fmt::Debug for Equa2<T>
14where T: fmt::Debug + Copy {
15 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
16 write!(f, "{:?} + {:?} + {:?}", self.0, self.1, self.2)
17 }
18}
19
20impl<T> Equa2<T>{
21 pub fn new(non_var: T, a: WithVar<T>, b: WithVar<T>) -> Self {
22 Equa2(non_var, a, b)
23 }
24
25 pub fn set_eq(&self, other: Self) -> ((char, T), (char, T))
26 where T: Add<T, Output = T> + Sub<T, Output = T> + Mul<T, Output = T> + Div<T, Output = T> + fmt::Debug + Zero + Copy { println!("{:?} = 0.0\n{:?} = 0.0", self, other);
28 let var_1: (char, T) = (self.1.var, self.repl_var( Equa1::new(other.0 - self.0, other.1 - self.1) / (self.2 - other.2).val, self.2.var).solve(T::ZERO));
29 let var_2: (char, T) = (self.2.var, self.plug_in(var_1.0, var_1.1).solve(T::ZERO));
30 println!("{:?} = {:?}\n{:?} = {:?}", var_1.0, var_1.1, var_2.0, var_2.1);
31 (var_1, var_2)
32 }
33
34 pub fn repl_var(&self, equa_1: Equa1<T>, var: char) -> Equa1<T>
35 where T: Mul<T, Output = T> + Add<T, Output = T> + Copy {
36 let (val_mul_of_var, other_mul_1) = self.get_var_mul_and_other(var); let equa_1 = equa_1 * val_mul_of_var.val;
38 Equa1::new(self.0 + equa_1.0, other_mul_1 + equa_1.1)
39 }
40
41 pub fn get_var_mul_and_other(&self, var: char) -> (WithVar<T>, WithVar<T>)
42 where T: Copy{
43 if self.1.var == var {
44 (self.1, self.2)
45 }else {
46 (self.2, self.1)
47 }
48 }
49
50 pub fn plug_in(&self, var: char, val: T) -> Equa1<T>
51 where T: Mul<T, Output = T> + Add<T, Output = T> + Copy {
52 if self.1.var == var {
53 Equa1::new(self.0 + self.1.val * val, self.2)
54 }else {
55 Equa1::new(self.0 + self.2.val * val, self.1)
56 }
57 }
58}