Get_value возвращает `f64` вместо `[u8; 4]`

Я использую ящик 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])

Чем можно объяснить такое поведение?

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
2
0
308
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 позволяет вам определять новые «псевдонимы типов» для существующих типов. По сути, вы сможете дать сложному типу сокращенное имя. Тем не менее, они все еще одного типа.

Другие вопросы по теме