标签: graphicspath

.Net与GraphicsPath.Widen()相反

我需要与GraphicsPath.Widen().Net 中的方法相反:

public GraphicsPath Widen()
Run Code Online (Sandbox Code Playgroud)

Widen()方法不接受否定参数,因此我需要等效的Inset方法:

public GraphicsPath Inset()
Run Code Online (Sandbox Code Playgroud)

您可以在开源Inkscape应用程序(www.Inkscape.org)中执行此操作,方法是转到菜单并选择"Path/Inset"(插入量存储在Inkscape属性对话框中).由于Inkscape是开源的,所以应该可以在C#.Net中执行此操作,但我不能在生命中使用Inkscape C++源代码(我只需要这个函数,所以我不能证明学习C++是正确的完成这个).

基本上,我需要一个带有此签名的GraphicsPath扩展方法:

public static GraphicsPath Inset(this GraphicsPath original, float amount)
{
   //implementation
}
Run Code Online (Sandbox Code Playgroud)

正如签名所述,它将采用一个GraphicsPath对象和.Inset()路径传递的数量......就像今天的Inkscape一样.如果它简化了任何问题,那么所讨论的GraphicsPath都是从该.PolyBezier方法创建的(并且没有其他内容),因此除非您想要完整性,否则不需要考虑rects,省略号或任何其他形状.

不幸的是,我没有使用C++代码的经验,所以我几乎不可能遵循Inkscape中包含的C++逻辑.

.

[编辑:]根据要求,这里是"MakeOffset"Inkscape代码.对于Inset,第二个参数(double dec)将为负,并且该参数的绝对值是引入形状的量.

我知道这里有很多依赖项.如果您需要查看更多的Inkscape源文件,请访问:http://sourceforge.net/projects/inkscape/files/inkscape/0.48/

int
Shape::MakeOffset (Shape * a, double dec, JoinType join, double miter, bool do_profile, double cx, double cy, double radius, Geom::Matrix *i2doc)
{
  Reset (0, 0);
  MakeBackData(a->_has_back_data);

    bool done_something = false;

  if (dec == 0)
  {
    _pts …
Run Code Online (Sandbox Code Playgroud)

c# open-source graphicspath

18
推荐指数
2
解决办法
5618
查看次数

将SVG路径数据转换为GDI + GraphicsPath数据

有没有一种简单的方法可以将SVG路径标记转换为C#System.Drawing.Drawing2D.GraphicsPath?它们都是密切相关的,我希望可以很容易地将SVG路径数据转换为GraphicsPath Points.

c# svg gdi+ graphicspath

11
推荐指数
1
解决办法
8193
查看次数

Path.reset vs Path.rewind

在机器人之间有什么区别path.reset()path.rewind()

文件说,

public void reset()

清除路径中的所有线条和曲线,使其变空.这不会更改填充类型设置.

public void rewind()

回退路径:清除路径中的所有行和曲线,但保留内部数据结构以便更快地重用.

但这究竟意味着什么?

什么时候应该使用?

android reset graphicspath

11
推荐指数
1
解决办法
6596
查看次数

从半透明位图创建GraphicsPath

我想创建一个GraphicsPath和一个Points列表,以形成位图的非透明区域的轮廓.如果需要,我可以保证每个图像只有一个非透明像素的固体集合.因此,例如,我应该能够沿着像素的边缘顺时针或逆时针记录点并执行完全闭环.

该算法的速度并不重要.但是,如果我可以在较小且较不复杂的GraphicsPath中跳过某些点来减少,那么结果点的效率是非常重要的.

我将列出下面的当前代码,它与大多数图像完美配合.但是,一些更复杂的图像最终会出现以错误顺序连接的路径.我想我知道为什么会这样,但我无法想出解决方案.

public static Point[] GetOutlinePoints(Bitmap image)
{
    List<Point> outlinePoints = new List<Point>();

    BitmapData bitmapData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

    byte[] originalBytes = new byte[image.Width * image.Height * 4];
    Marshal.Copy(bitmapData.Scan0, originalBytes, 0, originalBytes.Length);

    for (int x = 0; x < bitmapData.Width; x++)
    {
        for (int y = 0; y < bitmapData.Height; y++)
        {
            byte alpha = originalBytes[y * bitmapData.Stride + 4 * x + 3];

            if (alpha != 0)
            {
                Point p = new Point(x, y); …
Run Code Online (Sandbox Code Playgroud)

c# gdi+ bitmap graphicspath

6
推荐指数
1
解决办法
3731
查看次数

在GDI +中是否有相当于软笔?

我需要为我的GDI + GraphicsPath绘制一个柔和的宽轮廓.像这样的东西: 用光滑笔绘制的路径边缘(红色)

路径边缘以红色显示.我想用一支光滑的宽笔.我还需要能够控制笔的平滑度.

我试图用笔使用渐变画笔,但找不到有效的解决方案.

我可以通过使用黑色实心笔绘制轮廓并在结果图像上应用高斯平滑滤镜来实现所需的结果,但我想避免这种情况,因为当我必须处理可能非常大的整个图像时它很慢.

有没有办法画出平滑的路径轮廓?

graphics gdi+ graphicspath

5
推荐指数
1
解决办法
252
查看次数

Region.IsVisible(PointF)对于大浮点值的性能非常慢

我遇到了一个奇怪的性能问题,对我正在经历的行为进行解释会很好.

我正在使用System.Drawing.Region.IsVisible(PointF)来确定一个点是否在多边形内.这通常效果很好,但昨天我注意到,如果多边形很复杂并且由大的x和y值组成,则IsVisible方法的性能会变得非常慢.

下面是一些重现问题的代码(以及显示多边形形状的图像),对于较大的数组大小而言很抱歉,但在问题出现之前,多边形需要非常复杂.

当在原始点上调用IsVisible时,我的机器需要460 651毫秒才能完成,而当我首先将所有点除以1000,然后调用该方法时,它需要1毫秒.为什么我在时间上看到如此大的差异?我不认为浮动的实际值会影响性能.

using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;

namespace PerformanceTest
{
    class Program
    {
        static void Main(string[] args)
        {

            // Create complex polygon with large x and y values
            float[] xValues = {1.014498E+07f, 1.016254E+07f, 1.019764E+07f, 1.021519E+07f, 1.023274E+07f, 1.026785E+07f, 1.026785E+07f, 1.02854E+07f, 1.02854E+07f, 1.030295E+07f, 1.03205E+07f, 1.033805E+07f, 1.035561E+07f, 1.037316E+07f, 1.039071E+07f, 1.040826E+07f, 1.042581E+07f, 1.044337E+07f, 1.046092E+07f, 1.047847E+07f, 1.049602E+07f, 1.051357E+07f, 1.054868E+07f, 1.056623E+07f, 1.058378E+07f, 1.060133E+07f, 1.061888E+07f, 1.061888E+07f, 1.063644E+07f, 1.065399E+07f, 1.068909E+07f, 1.068909E+07f, 1.070664E+07f, 1.07242E+07f, 1.074175E+07f, 1.074175E+07f, 1.07593E+07f, 1.07593E+07f, 1.077685E+07f, 1.07944E+07f, 1.07944E+07f, …
Run Code Online (Sandbox Code Playgroud)

c# gdi+ region winforms graphicspath

5
推荐指数
2
解决办法
432
查看次数

C#使用GraphicsPath绘制圆形截面

我正在尝试使用3个参数绘制类似跟随形状的东西

  • 半径
  • 中央
  • cutOutLen

切出的部分是圆圈的底部.

在此输入图像描述

我发现我可以使用

var path = new GraphicsPath();
path.AddEllipse(new RectangleF(center.X - radius, center.Y - radius, radius*2, radius*2))
// ....
g.DrawPath(path);
Run Code Online (Sandbox Code Playgroud)

但是,我怎么画这样的东西呢?

顺便说一下,那个形状叫什么名字?由于缺乏术语,我无法搜索以前的问题.

谢谢.

c# gdi+ graphicspath

4
推荐指数
2
解决办法
4326
查看次数

.NET GDI +:绘制带圆角的线条

给定一个点数组,可以很容易地根据这些点绘制一条线,例如使用GraphicsPath类.

例如,以下几点...

[0]: (0,0)
[1]: (100,0)
[2]: (0,100)
[3]: (100,100)
Run Code Online (Sandbox Code Playgroud)

...描述了一个类似于Z的线.

但是接下来是挑战; 我需要绘制半径为10像素的圆角.在角落,我指的是线条中不是起点或终点的点.在这种情况下,有两个角(0,100)(100,0).

我玩过beziers,曲线和弧线,其中一些可能解决方案 - 我自己还没有找到它,因为我必须能够处理所有角度绘制的线条,而不仅仅是水平线条或垂直线条.

设置LineJoin所述的Pen目的是Round不充分的,因为这仅示出了具有较宽的笔.


编辑:为了澄清,我很清楚GraphicsPath类的bezier,曲线和弧功能.我正在寻找一些关于构建可以采用任意数量的点的算法的更具体的建议,并将它们与圆角串在一起.


我把以下函数放在一起,它返回一个表示带圆角的线的路径.该功能使用了LengthenLine功能,可在此处找到.

protected GraphicsPath GetRoundedLine(PointF[] points, float cornerRadius)
{
  GraphicsPath path = new GraphicsPath();
  PointF previousEndPoint = PointF.Empty;
  for (int i = 1; i < points.Length; i++)
  {
    PointF startPoint = points[i - 1];
    PointF endPoint = points[i];

    if (i > 1)
    {
      // shorten start point and add …
Run Code Online (Sandbox Code Playgroud)

.net drawing gdi+ rounded-corners graphicspath

3
推荐指数
1
解决办法
4806
查看次数

翻转绘制文本/字符串的GraphicsPath

我在我的Text Class中有这个方法,我似乎无法翻转整个文本.
我正在使用Matrix来转换GraphicsPath用于绘制字符串的内容.

以下是我使用@ Jimi答案的代码:

    public LayerClass DrawString(LayerClass.Type _text, string text, RectangleF rect, Font _fontStyle, Brush brush, float angle, PaintEventArgs e)
    {
        using (StringFormat string_format = new StringFormat())
        {
            SizeF stringSize = e.Graphics.MeasureString(text, _fontStyle);
            rect.Location = new PointF(Shape.center.X - (rect.Width / 2), Shape.center.Y - (rect.Height / 2));
            GraphicsContainer gc = e.Graphics.BeginContainer();
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
            e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
            //e.Graphics.DrawRectangle(Pens.Red, Rectangle.Round(rect));

            RectangleF r = new RectangleF(rect.Location, rect.Size);
            GraphicsPath path = new GraphicsPath();
            if (text == "" || text == " …
Run Code Online (Sandbox Code Playgroud)

c# text gdi+ winforms graphicspath

3
推荐指数
1
解决办法
387
查看次数

多边形三角测量的相反之处是什么?

在我完成2D三角测量后,一些三角形具有相同的颜色,我想重新组合它们以绘制成相似颜色的图形路径.我发现如果我只是逐个绘制三角形,一些图形渲染器会显示三角形之间的接缝(至少如果涉及抗锯齿和/或透明度).

那么我如何获取一组(非重叠)三角形并生成一个图形路径,其中可能包含孔和不相交的多边形?

盲目地将三角形添加到图形路径实际上非常适合填充(当然不是用于抚摸),但是导出那些额外的内部点感觉不对.

geometry triangulation pathgeometry computational-geometry graphicspath

2
推荐指数
1
解决办法
1635
查看次数

如何使用面板上的图形类绘制多色文本?

我想在面板上绘制以下文本:

示例文本

这是一个多颜色的文本。

我找到了这篇关于绘制彩色文本的文章

我用单词替换了字符,但它不起作用。

输出截图

(我使用FillPath/DrawPath来绘制文本)

我的代码:

private void Form1_Paint(object sender, PaintEventArgs e)
    {
        const string txt = "C# Helper! Draw some text with each letter in a random color.";

        // Make the font.
        using (Font the_font = new Font("Times New Roman", 40,
            FontStyle.Bold | FontStyle.Italic))
        {
            // Make a StringFormat object to use for text layout.
            using (StringFormat string_format = new StringFormat())
            {
                // Center the text.
                string_format.Alignment = StringAlignment.Center;
                string_format.LineAlignment = StringAlignment.Center;
                string_format.FormatFlags = StringFormatFlags.NoClip;

                // Make …
Run Code Online (Sandbox Code Playgroud)

.net graphics drawstring winforms graphicspath

1
推荐指数
1
解决办法
2896
查看次数