Tag: 图形

找到两个矩形的重叠区域(在C#中)

编辑: 简单的代码我用来解决问题以防任何人感兴趣(感谢Fredrik): int windowOverlap(Rectangle rect1, Rectangle rect2) { if (rect1.IntersectsWith(rect2)) { Rectangle overlap = Rectangle.Intersect(rect1, rect2); if (overlap.IsEmpty) return overlap.Width * overlap.Height; } return 0; } 原始问题: 我想知道一种快速而又脏的方法来检查两个矩形是否重叠,以及它们是否确实计算了重叠区域。 为了好奇,我对以下情况感兴趣:1)两个矩形中的所有线条都是垂直或水平的,或2)任何两个矩形的一般情况,但我真正需要的唯一答案是案例1。 我在想: double areaOfOverlap( Rect A, Rect B) { if ( A.Intersects(B) ) { // calculate area // return area } return 0; } 对于A.Intersects(),我正在考虑使用分离轴测试,但如果矩形只有水平和垂直线,那么还有更简单(更快)的检查方法吗? 如果矩形只有水平和垂直线,那么计算它们相交的区域有一个快速的方法吗? 最后,这与这个问题无关,但我很感激有人可能会在一本好书/网页上提出任何建议,我可以在那里查看计算机图形学的数学知识。 […]

.Net是否有任何控制台“图形”库?

我的基本目标是编写一个.NET翻拍的Kroz王国。 对于那些不熟悉游戏的人: http://www.indiefaqs.com/index.php/Kingdom_of_Kroz http://www.youtube.com/watch?v=cHwlNAFXpIw 最初它应该是一个快速的分心项目,让我从最近占据我大部分时间的所有通用企业WCF / WF / LINQ2SQL /等工作项目中rest一下。 虽然我的努力的结果是可玩的,它看起来像绝对的屁股(即使对于基于控制台的游戏),因为我重绘每个帧中的所有内容的方式。 我知道一些替代方法,但在我做过的简短测试中,他们仍然没有提供显着的性能或美学效益。 如果我可以帮助它,我不想求助于“模拟”控制台的库。 我更喜欢使用适当的Win32控制台API,但如果我可以帮助它,则不能直接使用它。 请记住,这是一个明显的利基用例,对此,“通常”接受的最佳方法是什么? 有没有人应该注意的特别优化的控制台’绘图’技术? 我不介意在PInvoke的海洋游泳和编组,只要它仍然以快速,响应和高效的控制台UI结束。

如何按比例调整.NET中任何类型的图像大小?

可以以独立于图像类型(bmp,jpg,png等)的方式按比例调整图像大小吗? 我有这个代码并知道缺少某些东西(但不知道是什么): public bool ResizeImage(string fileName, string imgFileName, ImageFormat format, int width, int height) { try { using (Image img = Image.FromFile(fileName)) { Image thumbNail = new Bitmap(width, height, img.PixelFormat); Graphics g = Graphics.FromImage(thumbNail); g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; Rectangle rect = new Rectangle(0, 0, width, height); g.DrawImage(img, rect); thumbNail.Save(imgFileName, format); […]

从多个线程渲染到单个Bitmap对象

我正在做的是将多个位图呈现给单个位图。 可能有数百个图像,并且渲染的位图可能超过1000×1000像素。 我希望通过使用多个线程来加快这个过程,但由于Bitmap对象不是线程安全的,因此它不能直接同时呈现。 我想的是将大位图分成每个cpu的部分,分别渲染它们然后在最后将它们连接在一起。 我还没有这样做,但是你们/女孩们有更好的建议。 有任何想法吗? 谢谢

如何调整图像大小而不会降低质量

我有一个高质量的大图像(根据我的需要),我需要调整到小尺寸(30 x 30px),我用graphic.DrawImage调整它的大小。 但是当我resize时,它会变得模糊不清。 我也尝试过CompositingQuality和InterpolationMode,但这一切都很糟糕。 例如,我正在尝试的质量。 我的结果 编辑图标的图像我画自己,也许它会更好地绘制它而不resize? EDIT2 调整代码大小: Bitmap tbmp; //drawing all my features in tbmp with graphics bmp = new Bitmap(width + 5, height + 5); bmp.MakeTransparent(Color.Black); using (var gg = Graphics.FromImage(bmp)) { gg.CompositingQuality = CompositingQuality.HighQuality; // gg.SmoothingMode = SmoothingMode.HighQuality; gg.InterpolationMode = InterpolationMode.HighQualityBicubic; gg.DrawImage(tbmp, new Rectangle(0, 0, width, height), new Rectangle(GXMin, GYMin, […]

将图像保存为位图而不会降低质量

我遇到了打印质量问题,我在此链接中对其进行了描述:在此处输入链接说明 我尝试了许多不同的解决方案,帮助其他类似概率的人,但他们不适合我,因为我有一个新的概率将图像保存为位图(低质量) 最后我决定问我当前的问题,因为正如你在上面的链接中看到的,我的问题在保存系统(96dpi)中的图像并恢复之后开始。 但我没有办法,所以我正在寻找一种方法,可以保存图像(具有从图形中绘制的像素),而不会降低质量。 提前

如何使用.NET在内存中动态创建jpg图像?

我有一个用C#编写的.NET(3.5 SP1)库(DLL)。 我必须通过类方法扩展此库,该方法将具有以下签名: public byte[] CreateGridImage(int maxXCells, int maxYCells, int cellXPosition, int cellYPosition) { … } 该方法应该执行以下操作: 输入参数maxXCells和maxYCells定义X和Y方向上的单元格网格的大小。 maxXCells和maxYCells是每个方向上的单元格数。 单个细胞是方形的。 (所以它是一种不对称的棋盘。) 输入参数cellXPosition和cellYPosition标识此网格中的一个特殊单元格,此单元格必须用十字形填充。 不需要花哨的图形,实际上只有白色背景上的黑色网格线和其中一个单元格中的X. 生成的图形必须具有jpg格式。 创建此图形必须在内存中进行,任何内容都不应存储在磁盘上的文件中,也不应绘制在屏幕上。 该方法将生成的图像作为byte[] 我对.NET中的图形function非常不熟悉所以我的问题是: 这是否可以使用.NET 3.5 SP1而没有额外的第三方库(我想避免)? 我必须遵循的基本步骤是什么,以及为实现这一目标需要了解的重要.NET命名空间,类和方法是什么(特别是在内存中绘制线条和其他简单的图形元素并将结果转换为字节jpg格式的数组)? 提前感谢您的建议!

在C#中的Picturebox上绘制一个箭头

我希望能够从一个鼠标点击位置绘制一个直箭头,就像你在PowerPoint中一样。 它也需要能够在PictureBox上绘图。

C#哪种屏幕拍摄速度最快?

我正在实现一个function,它将重复进行屏幕截图并在两个不同镜头之间输出脏矩形,然后在窗口中重新绘制屏幕。 我目前可以在20~30FPS之间运行。 它已经可以接受了。 但后来我做了一个基准并测量了它的性能。 发现Graphics.CopyFromScreen()占用了最多50%的处理时间。 (是的。即使在最坏的情况下,它仍然需要比找到所有脏矩形更长的时间)然后我使用本机API实现BitBlt()并没有得到任何改进。 我知道在这种情况下可能没有任何实际的理由让它快于30FPS。 我只是想知道,有没有更快的方式拍摄屏幕截图? 谢谢。

检测两个重合线段的重合子集

这个问题与以下内容有关: 如何确定GDI +中两条线的交点? (对代数的很好的解释,但没有代码) 如何检测两个线段相交的位置? (接受的答案实际上不起作用) 但请注意,一个有趣的子问题在大多数解决方案中都被完全掩盖了,即使有三个子案例,它们也只是在重合的情况下返回null: 巧合,但不重叠 触摸只是点和巧合 重叠/重合线子段 例如,我们可以像这样设计一个C#函数: public static PointF[] Intersection(PointF a1, PointF a2, PointF b1, PointF b2) 其中(a1,a2)是一个线段,(b1,b2)是另一个。 此function需要涵盖大多数实现或解释所掩盖的所有奇怪情况。 为了解释重合线的奇怪性,该函数可以返回PointF的数组: 如果线条平行或不相交(无限线相交但线段不相交 ,或线条平行 ),则为零结果点(或null) 一个结果点(包含交叉点位置),如果它们相交或者它们在一个点上重合 如果两条线重合,则两个结果点(对于线段的重叠部分)