2016-09-26 2 views
0

Я пытаюсь найти лучший способ рисовать полигоны в C# с краями, которые постепенно смешиваются с цветом фона. Я рисую многоугольники в растровое изображение, поэтому в настоящее время я использую классы Graphics из System.Drawing.многоугольник со смешанными краями

Полигоны будут маской для смешивания, у меня нет проблем рисовать полубоги черно-белые. Но я хочу, чтобы они постепенно переходили между двумя цветами на определенное количество пикселей, скажем, 50 пикселей (этот размер должен быть указан).

Я наткнулся на PathGradiantBrush, но не смог найти способ указать размер переходной зоны. С этой кистью переход, по-видимому, зависит от размера и формы многоугольника, а не от фиксированного размера.

Каков наилучший способ нарисовать такие полигоны?

+1

Действительно ли вы используете Microsoft Blend в соответствии с добавленным тегом? – Sayse

+0

Можете ли вы опубликовать пример изображения, чтобы все было ясно? – TaW

ответ

1

Как вы можете видеть в другом ответе, градиентные кисти заполнить путь или многоугольник с помощью с центром в центре градиент; Вы можете установить центральную точку, но они по-прежнему не совсем следуют ребра многоугольника:

enter image description here

Вы можете влиять на относительную ширину каждой цветовой группы, создавая ColorBlend собирается Transparent и подходящим Positions, как я сделал для приведенного выше результата, но угол egdes к центральной точке и их расстояние от ограничивающего прямоугольника будут по-прежнему определять их абсолютную ширину. Для кисти, например muliticolor градиент see here!


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

Вот решение, которое последует края:

enter image description here

Использование GraphicsPath path (или просто Point массива) и Graphics объект g он сначала заполняет цвет фона, а затем рисует путь с ручками, которые растут по ширине и прозрачности. Чтобы сохранить внешние края как на месте, так и непрозрачно, я установил Pen.Alignment = PenAlignment.Inset. Вы можете играть с числами, конечно ..:

g.FillPath(Brushes.MediumSeaGreen, path); 

int ew = 8; // edge width 

for (int i = 0; i < ew ; i++) 
    using (Pen pen = new Pen(Color.FromArgb(255 - i * 255/ew, Color.DarkSlateBlue), i)) 
    { 
     pen.Alignment = PenAlignment.Inset; 
     g.DrawPath(pen, path); 
    } 

Обратите внимание, что левый край выглядит немного толще, но это на самом деле нет; просто оптическая иллюзия.

+0

Спасибо, этот подход для рисования разных линий на краю фигуры будет работать для того, что я хочу сделать.Я собираюсь попробовать. –

0

Я посмотрел на градиентную кисть Path на MSDN и узнал о the FocusScales property, который, я считаю, пытается решить проблему, с которой вы столкнулись.

Вот пример из this page, показывающий использование FocusScales:

// Create a path that consists of a single ellipse. 
GraphicsPath path; 
path.AddEllipse(0, 0, 200, 100); 

// Create a path gradient brush based on the elliptical path. 
PathGradientBrush pthGrBrush(&path); 
pthGrBrush.SetGammaCorrection(TRUE); 

// Set the color along the entire boundary to blue. 
Color color(Color(255, 0, 0, 255)); 
INT num = 1; 
pthGrBrush.SetSurroundColors(&color, &num); 

// Set the center color to aqua. 
pthGrBrush.SetCenterColor(Color(255, 0, 255, 255)); 

// Use the path gradient brush to fill the ellipse. 
graphics.FillPath(&pthGrBrush, &path); 

// Set the focus scales for the path gradient brush. 
pthGrBrush.SetFocusScales(0.3f, 0.8f); 

// Use the path gradient brush to fill the ellipse again. 
// Show this filled ellipse to the right of the first filled ellipse. 
graphics.TranslateTransform(220.0f, 0.0f); 
graphics.FillPath(&pthGrBrush, &path); 

И пример выхода:

Example of FocusScales

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