Я использую ящик noise
и не понимаю, как преобразовать их Тип цвета в значение RGB.
noise = "0.7.0"
pub type Color = [u8; 4];
Я пытаюсь использовать функцию get_value()
, показанную здесь, в документах , как:
pub fn get_value(&self, x: usize, y: usize) -> Color {
let (width, height) = self.size;
if x < width && y < height {
self.map[x + y * width]
} else {
self.border_color
}
}
get_value()
реализовано для PlaneMapBuilder. Поэтому я ожидал бы, что PlaneMapBuilder::get_value(x,y)
вернет что-то в формате [r,g,b,a]
, но этого не происходит:
extern crate noise;
use noise::{utils::*, Billow};
fn main() {
let mut my_noise = PlaneMapBuilder::new(&Billow::new()).build();
let my_val = my_noise.get_value(1,1);
println!("{}", my_val.to_string());
///returns something like -0.610765515150546, not a [u8;4] as I would expect
}
В документах я вижу это определение add_gradient_point()
, которое принимает Color
в качестве параметра:
pub fn add_gradient_point(mut self, pos: f64, color: Color) -> Self {
// check to see if the vector already contains the input point.
if !self
.gradient_points
.iter()
.any(|&x| (x.pos - pos).abs() < std::f64::EPSILON)
{
// it doesn't, so find the correct position to insert the new
// control point.
let insertion_point = self.find_insertion_point(pos);
// add the new control point at the correct position.
self.gradient_points
.insert(insertion_point, GradientPoint { pos, color });
}
self
}
Здесь они используют структуру [u8; 4]
, которую я ожидал бы от типа Color
:
let jade_gradient = ColorGradient::new()
.clear_gradient()
.add_gradient_point(-1.000, [24, 146, 102, 255])
.add_gradient_point(0.000, [78, 154, 115, 255])
Чем можно объяснить такое поведение?
get_value()
реализован дляPlaneMapBuilder
Вы правы, что PlaneMapBuilder "реализует" get_value()
. Однако это не get_value()
из NoiseImage . На самом деле это NoiseMap , где его get_value() возвращает f64
, а не Color
.
В зависимости от того, какие «цвета» вы хотите, вместо этого вы можете использовать ImageRenderer и вызвать его метод render() с &my_noise
, который возвращает NoiseImage
.
// noise = "0.7.0"
use noise::{utils::*, Billow};
fn main() {
let my_noise = PlaneMapBuilder::new(&Billow::new()).build();
let image = ImageRenderer::new().render(&my_noise);
let my_val = image.get_value(1, 1);
println!("{:?}", my_val);
// Prints: `[18, 18, 18, 255]`
}
Здесь они используют структуру
[u8; 4]
, которую я ожидал бы от типаColor
.
Просто для ясности, это одно и то же в данном случае. Короче говоря, ключевое слово type
позволяет вам определять новые «псевдонимы типов» для существующих типов. По сути, вы сможете дать сложному типу сокращенное имя. Тем не менее, они все еще одного типа.