Перейти к содержимому

Как нарисовать эллипс в c

  • автор:

Нарисовать эллипс

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

ПРИМЕЧАНИЕ: Это действие предназначено только для использования в различных событиях рисования и не будет рисовать ничего, если использовать его в других местах.

Синтаксис действия:

Draw Ellipse Icon

Аргументы:
Аргумент Описание
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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *