2013-11-21 2 views
0

Как красиво генерировать случайные цвета в Delphi? У меня этот код в java, но мне не удалось перевести его в Delphi.Алгоритм случайной генерации цветовой палитры в Delphi

public Color generateRandomColor(Color mix) { 
    Random random = new Random(); 
    int red = random.nextInt(256); 
    int green = random.nextInt(256); 
    int blue = random.nextInt(256); 

    // mix the color 
    if (mix != null) { 
     red = (red + mix.getRed())/2; 
     green = (green + mix.getGreen())/2; 
     blue = (blue + mix.getBlue())/2; 
    } 

    Color color = new Color(red, green, blue); 
    return color; 
} 
+2

Используя ответ вы связаны с Вами и немного прибегая к помощи он должен быть довольно тривиально, чтобы перевести это в код delphi. – OGHaza

+1

Вы уже знаете алгоритм, поэтому с небольшим усилием ** вы ** можете сделать это в Delphi. –

+0

Что вы начали до сих пор? Нам нужно что-то, по крайней мере, продолжать. Предполагая, что вы знаете, как сделать цвет, просто выяснить, как сделать случайное число в delphi, и вы должны иметь возможность правильно преобразовать java-пример? –

ответ

2

просто следовать код размещен в качестве примера и перевести его на Delphi, это довольно легко сделать

function GenerateRandomColor(const Mix: TColor = clWhite): TColor; 
var 
    Red, Green, Blue: Integer; 
begin 
    Red := Random(256);  
    Green := Random(256); 
    Blue := Random(256); 

    Red := (Red + GetRValue(ColorToRGB(Mix))) div 2;  
    Green := (Green + GetGValue(ColorToRGB(Mix))) div 2; 
    Blue := (Blue + GetBValue(ColorToRGB(Mix))) div 2; 
    Result := RGB(Red, Green, Blue); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Self.Color := GenerateRandomColor; 
end; 

initialization 
    Randomize; 
+2

Это неправильный перевод. default должно быть 'clWhite' (255, 255, 255), а' getRValue (red) '(и т. д.) должно быть' getRValue (mix) '(и т. д.). Кроме того, «TColor» следует преобразовать с помощью «ColorToRGB». Кстати, почему вы используете 'generateRandomColor' в качестве локальной функции? плюс Delphi (обычно) имеет собственный код/​​соглашение об именах. – kobik

+0

@kobik, конечно, вы правы, должен быть 'getRValue (mix)', мой плохой. я редактировал код; , но где я должен использовать 'ColorToRGB()'? в 'GetXValue'? но 'getRValue (clRed)' возвращает '$ FF', поскольку' getBValue (clBlue) 'также возвращает' FF'. Кажется, все в порядке, не так ли? Кажется, вы также правильно указали значение параметра по умолчанию как белый, потому что в примере изображение всех цветов довольно светлое. но в этом примере это не имеет значения. ps: что не так с моими локальными функциями и соглашениями об именах? :) – teran

+0

Да, 'ColorToRGB' необходим в' GetXValue'. «TColor» может быть отрицательным (системные цвета). Я также не думаю, что тест для (mix> 0) необходим - оригинальные примеры Java-примеров для null. Я отредактирую ваш ответ, чтобы показать, что я имею в виду, с местным fucntion/naming. Вы можете откатить его обратно, если вам это не нравится :) – kobik

Смежные вопросы