Вы можете использовать ящики num или num-traits и связать свой общий тип функции с num::Float
, num::Integer
или любой другой признак:
extern crate num;
use num::Float;
fn main() {
let f1: f32 = 2.0;
let f2: f64 = 3.0;
let i1: i32 = 3;
println!("{:?}", sqrt(f1));
println!("{:?}", sqrt(f2));
println!("{:?}", sqrt(i1)); // error
}
fn sqrt(input: T) -> T {
input.sqrt()
}
Я не хочу входить в написание кода для этого теперь, но если я понимаю "frustum" правильно, следующее должно работать.
Но я, возможно, полностью неправильно понял. В этом случае уточните :)
Добавляя к тому, что Раздражительный Капрал сказал выше, необходимо будет знать, как пересечь линейный сегмент с плоскостью. В описании на той странице u представляет параметр в параметрическом определении Вашей строки. Во-первых, вычислите u использование одного из этих 2 описанных методов. Если значение падений u диапазона 0,0 к 1,0, то плоскость отсекает строку где-нибудь на Вашем сегменте. Включение u назад в Ваше уравнение строки дает Вам точку, где то пересечение происходит.
Другой подход должен найти направленное расстояние каждой точки к плоскости. Если расстояние одной точки положительно, и другой отрицательно, то они лежат на противоположных сторонах плоскости. Вы затем знаете, который точка вне Вашего frustum (на основе который путь Ваши плоские нормальные точки). Используя этот подход, находя точку пересечения может быть сделан быстрее путем выполнения линейной интерполяции на основе отношения направленных расстояний. Например, если расстояние одной точки +12, и другой-12, Вы знаете, что плоскость сокращает сегмент в половине, и Ваш u параметр 0.5.
Надеюсь, это поможет.