凸包问题的 5 种算法
前言
首先,什么是凸包? 假设平面上有p0~p12共13个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候,我们就叫它“凸包”。如下图:
首先,什么是凸包? 假设平面上有p0~p12共13个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候,我们就叫它“凸包”。如下图:
log4net 是 .Net 下一个非常优秀的开源日志记录组件。log4net 记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。本文主要是介绍如何在 Visual Studio 中使用 log4net 快速创建系统日志,如何扩展以输出自定义字段。
FreeMove 是一款可以移动已安装软件程序文件夹的软件,很多时候软件在安装的时候选在了 A 分区,但是使用过一段时间后想移动到 B 分区,但是又不想卸载重新安装,这时候就需要用到这款 FreeMove 软件了。
有时您希望向用户显示一些对象,但您希望将自定义(字符串)标签与之关联,视图中将显示该标签。因此要创建易用类来包装对象并关联这个标签。
在我曾经需要调试绑定的每个项目上,最简单的方法是在绑定上放置一个转换器,它只记录它看到的值。`DebugConverter 就是这样一个转换器的实现,它将记录对 Visual Studio 输出窗口的每次调用,前提是你正在运行一个调试版本。
在几乎每个项目中,我都需要根据 ViewModel 中的一些 bool 值隐藏/显示一个元素。您可以使用 DataTriggers 或使用转换器来实现这一点。
Caliburn.Micro 附带了一个名为 IoC 的静态服务定位器。这让你可以从代码中的任何地方访问 IoC 容器,就像这样:
1 | var vm = IoC.Get<MyDialogViewModel>(); |
Stylet
没有包含这个,而且有很好的理由:我不想鼓励人们编写如此糟糕的代码。服务定位器模式经常被称为反模式。现在每个类都有一个对
IoC
的依赖(而不是它所依赖的实际类),您不能仅通过查看类的构造函数就知道它的依赖关系是什么,相反,您必须遍历代码以才能得知它对IoC.Get
的调用。
IoC 也在 Caliburn 内部使用导致产生了一些糟糕的设计选择。这些已经在 Stylet 中重新架构,因此内部不再需要IoC。
如果你真的需要 IoC 的支持(尽管它会导致糟糕的代码风格),那么你可以很容易地编写自己的 IoC。首先创建这个静态 IoC 类:
1 | public static class IoC |
然后在引导程序中添加下面的代码:
1 | protected override void Configure() |
Execute
是一个小的静态帮助类,它使得在UI线程上运行委托变得更容易。它包装了
Application.Current.Dispatcher
,并提供使其更容易和更简洁使用的方法。
它还提供了一个属性的帮助类:Execute.InDesignMode
。当且仅当
Visual Studio 或 Expression Blend
设计器处于活动状态,并且代码为了设计时显示提供虚拟数据时。
下表给出了它提供的方法的总结,后面给出了更深入的解释:
Method | Inline if possible | Waits for Completion |
---|---|---|
Execute.OnUIThread | ✔ | ✘ |
Execute.OnUIThreadSync | ✔ | ✔ (Blocks) |
Execute.OnUIThreadAsync | ✔ | ✔ (Task) |
Execute.PostToUIThread | ✘ | ✘ |
Execute.PostToUIThreadAsync | ✘ | ✔ (Task) |
Inline if possible: 该方法将检查当前线程是否为UI线程。如果是,则委托将同步运行。如果不是,那么它将以某种形式被分派到UI线程。
Waits for completion: 要么阻塞直到委托完成执行,要么返回一个任务,该任务在委托完成执行时完成。
Screen 和 Conductor 是一个简单的主题,但它需要一些思维跳跃,并且要求您在它们变得有意义之前覆盖它们的所有部分。相信我,值得你花时间阅读这篇文章——它们非常强大,值得你花时间投资。