我正在做一些工作(太复杂无法解释),我的任务之一是我需要将平滑多边形的光栅图像转换为骨架.所以我需要做这样的事情:

我有光栅图像(在左侧),我想要一个由表示图像的点和边(右侧)组成的图形.
我读过算法,特别是Steven Skiena的一本书,他告诉我使用"刷火"算法,他解释为"每个循环,遍历边缘的每个点,对于碰撞的边缘添加一个点到骨架并删除剩余的点,继续下一个循环,直到只剩下骨架"但我在网上找到的所有信息都是关于机器人的一些寻路算法,我不明白如何在这里应用它(基本上如果我只有填充/空白像素的坐标,我怎么知道"边缘".
我已经查找了CGAL库和它的骨架演示,但是当多边形有很多顶点时,它不能很好地完成,所以只需将边框上的每个顶点转换为多边形的顶点,然后将其提供给算法就不会产生效果很好.
我希望这必须是一个常见的算法,因为任务似乎是非常基本的,但我不想发明轮子,我找不到任何关于这个主题(也许是因为我不知道正确的关键字)
我BinaryFormatter用来存储我的应用程序设置.现在,经过几年的持续开发,在许多用户已经在使用我的应用程序之后,我想要更改几个类的命名方式以及它们所在的命名空间.但是,如果我这样做,则无法再加载设置,因为BinaryFormater它们通过其代码内名称调用.
因此,例如,如果我更改MyNamespace.ClassOne为MyNamespace.Class.NumberOne代码,我将无法再加载设置,因为MyNamespace.ClassOne不再存在.
我想要进行此更改并允许用户保留其设置文件.这可能吗?
我的意思是,我想我可以研究它保存的格式,并手动更改二进制文件,替换类名,但这将是黑客的方法.必须有一个正常的方法,对吗?
我正在创建一个具有类似于Photoshop的界面的应用程序:多个单独的表单都有助于编辑对象.所以,我将有多个表单,其中一个是"main"(提供文件菜单,设置菜单,等等),其他表单有控件,用于编辑以主窗体打开的对象.
让我们说简单,这是一个文本编辑器,我有MainForm和StyleForm.现在,我需要的是整个应用程序在Windows任务栏中显示为一个"栏".这可以通过为StyleForm设置ShowInTaskbar为false来实现,但是如果我,比如聚焦其他应用程序,然后关注我的应用程序,只有MainForm将在其他窗口之上,StyleForm将保持隐藏在我专注的应用程序窗口下先前.
我在这里找到答案当选择一个表单但导入一个dll 时,使与程序关联的所有表单都出现在前面.也许这有一个.net解决方案?
另外,我想在任务栏中显示不同的内容,而不是MainForm的标题,这可能吗?
如果您在 TreeView 的 keydown 事件中打开任何模式对话框(或者在 KeyPreview=true 的表单中,如果焦点位于 TreeView 上),您将听到烦人的 DING 声!
我该如何防止它发生?
此叮声通常是按键事件未处理的信号(例如,默认情况下 TextBox 会因 Ctrl+A 等而发出叮声)。但是,设置 e.Handled 或 e.SuppressKeyPress 对于 TreeView 中的模式对话框没有帮助。除了打开模式对话框之外,它在执行任何操作时都会有所帮助!
我正在制作一个程序,将其数据存储在XML文件中.当人们编写XML时,他们可以犯下微妙的错误,例如结束注释,-看起来像是<!-- comment --->在</>内部添加属性.当然,XML仍然可以正确读取,但是尝试将此文本输入到XmlDocument中会产生语法错误(并且不会被解析).
有没有办法使XmlDocument不那么严格,并使它忽略不会使文档无法解析的违反标准?例如,它显然<!-- comment --->仍然是一个注释,即使它-最终包含的是违反标准规范的).
我有一个简单的类,它在一个很可能是树的图形中表示一个顶点.因此,这个类看起来像这样:
class Vertex {
public Vertex parent;
public List<Vertex> children;
}
Run Code Online (Sandbox Code Playgroud)
在不太可能的循环情况下,我可以多次链接到与子相同的顶点.
现在,我创建了一个枚举器,它将给出图中的每个顶点.这样你就可以做到
foreach (Vertex item in rootVertex)
Run Code Online (Sandbox Code Playgroud)
并获取图中的每个顶点.为此,我必须使我的类IEnumerable {Vertex}并编写GetEnumerator方法,以递归方式生成所有Vertexes.
现在,为了绘制图形,我想在同一个类中有另一个枚举器,它将返回图中的每个边.所以我可以做点什么
foreach (Point[] item in rootVertex.GetEdges())
Run Code Online (Sandbox Code Playgroud)
并获得所有优势.为此,为了避免混淆,我从我的类中删除了IEnumerable,并实现了两个这样的方法
public IEnumerator<Vertex> GetVertexes() { ...code... }
public IEnumerator<Point[]> GetEdges() { ...code... }
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试做的时候
foreach (Point[] item in rootVertex.GetEdges())
Run Code Online (Sandbox Code Playgroud)
它吐出错误 - foreach无法枚举rootVertex,因为Vertex类不包含GetEnumerator方法.
我试过谷歌搜索,但没有发现或不能我或不能在同一个班级上制作多个调查员.