Нарисуйте ведро с несколькими жидкостями - PullRequest
0 голосов
/ 29 февраля 2012

Мне нужно нарисовать ведро и заполнить его двумя разными жидкими цветами (желтым и красным).

Я дошел до жестко закодированной версии, но мне нужно иметь возможность указать% заполненного сегмента, например, 50% желтого и 10% красного.

Я никогда не делал графику в C #, поэтому любая помощь в этом приветствуется. Я также нуждаюсь в более чистом способе сделать дно ковша, так как он рисует черную линию поверх желтого в следующем примере. Current output of code

private Bitmap drawBucket2()
    {
        Bitmap img = new Bitmap(200, 200);


        using (Graphics g = Graphics.FromImage(img))
        {
            try
            {
                Pen penBlack = new Pen(Color.Black, 1);                    
                Pen penYellow = new Pen(Color.Yellow, 1);
                Brush brushYellow = new SolidBrush(Color.Yellow);
                Brush brushRed = new SolidBrush(Color.Red);
                Point[] pts = new Point[4];
                pts[0] = new Point(11, 115);
                pts[1] = new Point(170, 115);
                pts[2] = new Point(162, 180);
                pts[3] = new Point(21, 180); 

                g.FillEllipse(brushYellow, 11, 90, 160, 50);
                g.FillPolygon(brushYellow, pts);

                pts = new Point[3];
                pts[0] = new Point(21, 180);
                pts[1] = new Point(91, 195);
                pts[2] = new Point(162, 180);
                g.FillClosedCurve(brushYellow, pts);

                /*outline */
                g.DrawEllipse(penBlack, 2, 10, 180, 50);
                g.DrawLine(penBlack, 1, 35, 21, 180);
                g.DrawLine(penBlack, 182, 35, 162, 180);
                pts = new Point[3];
                pts[0] = new Point(21, 180);
                pts[1] = new Point(91, 195);
                pts[2] = new Point(162, 180);
                g.DrawClosedCurve(penBlack, pts);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
        return img;
    }

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

Хорошо, у вас нет кода, но я могу дать вам примерный рабочий процесс для достижения этой цели.По сути, вы хотите нарисовать ваши объекты спереди, так что я буду рисовать в таком порядке

  1. Нарисуйте дно ведра как эллипсэллипс того же размера, но на один пиксель выше
  2. Теперь нарисуйте эллипсы на каждом Y-пикселе выше, пока не будет достигнут желаемый%, где конечное число пикселей вычисляется по (нижней части сегмента)+ ((верхняя часть ведра) - (нижняя часть ведра) * (процент / 100)).Вам нужно будет расширить эллипс в определенных точках.Это создаст эффект псевдонима, но не волнуйтесь, мы нарисуем его следующим
  3. Наконец нарисуем стороны ведра и вершины.Если вы выберете подходящую толщину линии, вы можете смело скрывать тот факт, что взломали свой путь к славе :)

Последнее, что я бы посоветовал много проб и ошибок.Чем больше вы сделаете это, тем легче станет!Удачи

1 голос
/ 01 марта 2012

Мне удалось решить эту проблему, я публикую здесь код, чтобы узнать, сможет ли кто-нибудь еще улучшить его, прежде чем я приму это в качестве ответа.

1 голос
/ 29 февраля 2012

"Жидкости" - это две эллипсы с заполненным промежутком между ними, поэтому все, что вам нужно рассчитать, это высоты, а также левое и правое положения в зависимости от количества жидкости и отрисовки снизу вверх (т.е. желтый, затем красный)

// Upper Elipse and top Points for the filled center
y = HeightOfBottom + (FullHeight * (StartAmountFloat + AmountFloat))
x1 = Middle - (DiffenceOfDiameter * (StartAmountFloat + AmountFloat))
x2 = Middle + (DiffenceOfDiameter * (StartAmountFloat + AmountFloat))

// Lower Elipse and bottom Points for the filled center
y = HeightOfBottom + (FullHeight * StartAmountFloat)
x1 = Middle - (DiffenceOfDiameter * StartAmountFloat)
x2 = Middle + (DiffenceOfDiameter * StartAmountFloat)

Низ также должен быть нижней половиной эллипса.

...