Нарисовать эллипс
Это действие нарисует эллипс в заданном месте комнаты. Вы указываете верхнюю левую позицию и нижнюю правую позицию области, в которую должен «вписаться» эллипс, и эллипс будет нарисован между ними. Позиции могут быть либо абсолютным положением в комнате, либо положением относительно экземпляра, вызывающего действие, а также можно установить, может ли эллипс быть заполнен или очерчен, установив флажок заполнения внизу.
ПРИМЕЧАНИЕ: Это действие предназначено только для использования в различных событиях рисования и не будет рисовать ничего, если использовать его в других местах.
Синтаксис действия:

Аргументы:
| Аргумент | Описание |
|---|---|
| Left | Левая позиция, с которой начинается рисование |
| Top | Верхняя позиция, с которой следует начинать рисовать |
| Right | Правильная позиция для завершения рисования |
| Bottom | Нижняя позиция для завершения рисования |
Пример:
Приведенный выше код блока действий рисует серию очерченных концентрических эллипсов в позиции экземпляра.
Окружность и эллипс
Вместо четырех параметров — координат диагональных углов прямоугольника — методу Ellipse можно передать один — объект типа TRect. Следующий фрагмент кода демонстрирует использование объекта TRect в качестве параметра метода Ellipse.
TRect rec = Rect(10,10,50,50);
Canvas->Ellipse(rec);
Как и в случае вычерчивания других примитивов, вид контура эллипса (цвет, толщину и стиль линии) определяют значения свойства Реn, а цвет и стиль заливки области внутри эллипса — значения свойства Brush той поверхности (canvas), на которой метод чертит.
Fore kc .ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий
Рисование и заполнение базовой фигуры
В этом разделе описывается, как нарисовать простую фигуру. Интерфейс ID2D1RenderTarget предоставляет методы для структурирования и заполнения многоточия, прямоугольников и линий. В следующих примерах показано, как создать и нарисовать многоточие.
Этот раздел состоит из следующих подразделов.
- Рисование контура эллипса с помощью сплошного росчерка
- Рисование эллипса пунктирным росчерком
- Рисование и заполнение эллипса
- Рисование более сложных фигур
- Связанные темы
Рисование контура эллипса с помощью сплошного росчерка
Чтобы нарисовать контур эллипса, определите кисть (например , ID2D1SolidColorBrush или ID2D1LinearGradientBrush) для рисования контура и D2D1_ELLIPSE для описания положения и измерений эллипса, а затем передайте эти объекты в метод ID2D1RenderTarget::D rawEllipse . В следующем примере создается черная кисть сплошного цвета и она сохраняется в m_spBlackBrush член класса.
hr = m_pRenderTarget->CreateSolidColorBrush( D2D1::ColorF(D2D1::ColorF::Black), &m_pBlackBrush );
Следующий пример определяет D2D1_ELLIPSE и использует его с кистью, определенной в предыдущем примере, для рисования контура эллипса. В этом примере создаются выходные данные, показанные на следующем рисунке.

D2D1_ELLIPSE ellipse = D2D1::Ellipse( D2D1::Point2F(100.f, 100.f), 75.f, 50.f ); m_pRenderTarget->DrawEllipse(ellipse, m_pBlackBrush, 10.f);
Рисование эллипса пунктирным росчерком
В предыдущем примере использовался простой росчерк. Вид росчерка можно изменить несколькими способами, создав ID2D1StrokeStyle. ID2D1StrokeStyle позволяет указать фигуру в начале и конце штриха, имеет ли она тире шаблон и т. д. В следующем примере создается идентификатор ID2D1StrokeStyle , описывающий пунктирный штрих. В этом примере используется предопределенный шаблон дефиса , D2D1_DASH_STYLE_DASH_DOT_DOT, но вы также можете указать свой собственный.
D2D1_STROKE_STYLE_PROPERTIES strokeStyleProperties = D2D1::StrokeStyleProperties( D2D1_CAP_STYLE_FLAT, // The start cap. D2D1_CAP_STYLE_FLAT, // The end cap. D2D1_CAP_STYLE_TRIANGLE, // The dash cap. D2D1_LINE_JOIN_MITER, // The line join. 10.0f, // The miter limit. D2D1_DASH_STYLE_DASH_DOT_DOT, // The dash style. 0.0f // The dash offset. ); hr = m_pDirect2dFactory->CreateStrokeStyle(strokeStyleProperties, NULL, 0, &m_pStrokeStyle);
В следующем примере используется стиль штриха с методом DrawEllipse . В этом примере создаются выходные данные, показанные на следующем рисунке.

m_pRenderTarget->DrawEllipse(ellipse, m_pBlackBrush, 10.f, m_pStrokeStyle);
Рисование и заполнение эллипса
Чтобы закрасить внутреннюю часть эллипса, используйте метод FillEllipse . В следующем примере метод DrawEllipse используется для контура эллипса, а затем используется метод FillEllipse для рисования его внутренней части. В этом примере создаются выходные данные, показанные на следующем рисунке.

m_pRenderTarget->DrawEllipse(ellipse, m_pBlackBrush, 10.f, m_pStrokeStyle); m_pRenderTarget->FillEllipse(ellipse, m_pSilverBrush);
В следующем примере сначала заполняется многоточие, а затем рисуется его контур. В этом примере создаются выходные данные, показанные на следующем рисунке.

m_pRenderTarget->FillEllipse(ellipse, m_pSilverBrush); m_pRenderTarget->DrawEllipse(ellipse, m_pBlackBrush, 10.f, m_pStrokeStyle);
Код был опущен в этих примерах.
Рисование более сложных фигур
Чтобы нарисовать более сложные фигуры, необходимо определить объекты ID2D1Geometry и использовать их с методами DrawGeometry и FillGeometry . Дополнительные сведения см. в разделе Общие сведения о геометриях.
Как нарисовать эллипс по координатам на Image?
Есть класс который позволяет нарисовать эллипс по координатам x, y на канвасе. Как можно нарисовать такой же эллипс по координатам, только не на канвасе а на Image?
class draw < public static void circle(double x, double y, int width, int height, Canvas cv) < Ellipse circle = new Ellipse() < Width = width, Height = height, Stroke = Brushes.Red, StrokeThickness = 6 >; cv.Children.Add(circle); circle.SetValue(Canvas.LeftProperty, (double)x); circle.SetValue(Canvas.TopProperty, (double)y); > > draw.circle(x, y, 10, 10, cavRoot);
Отслеживать
20.2k 6 6 золотых знаков 37 37 серебряных знаков 81 81 бронзовый знак
задан 15 апр 2020 в 15:20
317 2 2 серебряных знака 17 17 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Как можно нарисовать такой же эллипс по координатам, только не на канвасе а на Image?
Одно другому не противоречит — можно разместить на Canvas Image, а поверх него нарисовать эллипс. Но механизм для рисования на изображении в WPF тоже существует, это DrawingVisual и RenderTargetBitmap:
using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Imaging; namespace WpfTest < public partial class MainWindow : Window < public void circle(double x, double y, int width, int height, Image img) < Rect rect = new Rect(0, 0, img.ActualWidth, img.ActualHeight); DrawingVisual visual = new DrawingVisual(); if (rect.Width == 0 || rect.Height == 0) < rect.Width = img.Width; rect.Height = img.Height; >using (DrawingContext dc = visual.RenderOpen()) < dc.DrawImage(img.Source,rect); dc.DrawEllipse(null, new Pen(Brushes.Red, 6), new Point(x+width/2, y+height/2), width/2, height/2); >RenderTargetBitmap rtb = new RenderTargetBitmap( (int)rect.Width, (int)rect.Height, 96, 96, PixelFormats.Default); rtb.Render(visual); img.Source = rtb; > public MainWindow() < InitializeComponent(); img.Source = new BitmapImage(new Uri(@"C:\Test\Images\test.jpg")); >private void Button_Click(object sender, RoutedEventArgs e) < circle(10, 10, 50, 50, img); >> >
Данный код хорош работает, если изображение отображается в Image в натуральную величину. Если оно уменьшено, типично для растровой графики, будет потеря качества. Чтобы уменьшить ее, можно вот так изменить код отрисовки, добавив перемасштабирование:
public void circle(double x, double y, int width, int height, Image img) < double k = img.ActualWidth / img.Source.Width; Rect rect = new Rect(0, 0, img.Source.Width, img.Source.Height); DrawingVisual visual = new DrawingVisual(); if (rect.Width == 0 || rect.Height == 0) < rect.Width = img.Width; rect.Height = img.Height; >if (k == 0) < k = img.Width / img.Source.Width; >//пересчитаем координаты с учетом масштабного коэффициента x = x / k; y = y / k; width = (int)Math.Round((double)width / k); height = (int)Math.Round((double)height / k); using (DrawingContext dc = visual.RenderOpen()) < dc.DrawImage(img.Source,rect); dc.DrawEllipse(null, new Pen(Brushes.Red, 6/k), new Point(x+width/2, y+height/2), width/2, height/2); >RenderTargetBitmap rtb = new RenderTargetBitmap( (int)rect.Width, (int)rect.Height, 96, 96, PixelFormats.Default); rtb.Render(visual); img.Source = rtb; >
Но предпочтительнее было бы использовать способ с добавлением Image в Canvas и рисованием фигуры на Canvas поверх него. При таком способе полностью задействована векторная графика и потери качества не будет независимо от масштаба. Преобразовать итоговый результат в растровое изображение вы все равно сможете, используя RenderTargetBitmap уже на Canvas.