小编dlr*_*as2的帖子

判断鼠标是否位于表单上方的最佳方法是什么?

我想出了如何捕获整个表单上的鼠标点击,但此方法不能很好地转换为MouseEnterMouseLeave。我的表单布局由许多组成PanelsTableLayoutPanels因此没有可以监视事件的包罗万象的控件,显然MouseLeave按钮的事件并不意味着光标离开整个表单。有没有人想出一个好方法来解决这个问题?

.net c# mouseover winforms

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

在内部使用属性有什么好处?

当从类外部访问成员时,封装显然是有用且必不可少的,但是当在内部引用类变量时,调用其私有成员或使用其getter更好吗?如果你的getter只是返回变量,那么性能是否存在差异

c# getter performance encapsulation properties

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

实现一维碰撞检测的最佳方法是什么?

我正在编写一个模拟软件,需要一种有效的方法来测试沿线的碰撞.

模拟的是火车穿越轨道上的几个开关.当车轮在开关N英寸范围内时,开关打开,然后在车轮离开时关闭.由于所有车轮尺寸相同,并且所有开关尺寸相同,我可以将它们表示为沿轨道的单个坐标X. 一旦设定,开关距离和车轮距离就不会相互改变.

当通过将X坐标放入列表并遍历它们时通过蛮力完成这是一个相当微不足道的问题,但我需要一种有效的方法,因为它需要非常准确,即使列车高速移动.有大量关于2D碰撞检测的教程,但我不确定这种独特的1D场景的最佳方法.


显然,我的数据看起来有些混乱.

我正在模拟一个站点,而不是整个区域.火车可以是任何长度的,有不同类型的汽车,但只有一列火车.我的列车数据是表格{48,96,508,556,626,674,...},表示从火车前部(0)到车轴中心的距离.

(列车数据更有可能以有序的 物体列表的形式出现在我的身上Car ,每个物体都有一个长度和一个整数列表,表示距离汽车前部的车轴距离,但它们都聚合成一个列表,因为所有车轴对我来说都是一样的.)

我的开关都在几百英尺内,通常完全由火车覆盖.开关可以在几百英尺到几英寸之间的任何间隔,并且与火车的形式相同:{0,8,512,520,...},表示距离站点的开头到交换机的中心.

最后,我知道车轮启动开关的距离,以英寸为单位.

例如,使用上述样本数据和8英寸的激活距离,当列车到达X = 40时,X = 0处的第一个开关将激活,这意味着火车距离现场40英寸.当火车到达X = 48时,X = 8的开关也被激活.在X = 56时,第一个开关熄灭,而在X = 64时,第二个开关也熄灭.不同的轴在穿过现场时打开和关闭不同的开关.

火车通常以低于10英里/小时的速度运行,但可以更高.(现在我们的模拟时速仅为30英里/小时,但更高会更好.)

.net c# algorithm simulation collision-detection

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

最小的边界四叉树节点

我正在编写一个基于整数的四叉树结构,它从节点构建而不是向下.为此,我需要发现包含所有元素的下一个最大节点.如果我定义了一个预先存在的节点,那么尝试在该节点的边界之外添加一个项目,它需要创建一个更大的节点来包含它们.我有(认为很聪明的)代码,用于查找单个点周围的边界框:

public static Rectangle BoundingRectangle(Point p, int magnitude)
{
    Rectangle bounds = new Rectangle()
    {
        X = (p.X & ~((1 << magnitude) - 1)),
        Y = (p.Y & ~((1 << magnitude) - 1)),
        Width = (1 << magnitude),
        Height = (1 << magnitude)
    };
    return bounds;
}
Run Code Online (Sandbox Code Playgroud)

[注意,点(0,0)周围的方框是位置(0,0)的盒子大小(1,1), 而不是位置(-.5, - .5),因为它都是基于整数的]

这将永远(从我所知道的)返回一个盒子,它可以作为一个节点适合四叉树.例如,new Rectangle(0,0,2,2)可以接受new Rectangle(2,2,2,2),但new Rectangle(1,1,2,2)不会.

我的问题是我无法弄清楚如何为一个矩形而不是一个点来实现这个目标.我能想到的唯一解决方案是循环增加数量级的盒子,但我确信必须有一些我无法想到的O(1)解决方案.


例子:

Rectangle(X,Y,1,1) -> Rectangle(X,Y,1,1)
Rectangle(0,0,2,2) -> Rectangle(0,0,2,2)
Rectangle(1,1,2,2) -> Rectangle(0,0,4,4)
Rectangle(1,1,3,3) -> Rectangle(0,0,4,4)
Rectangle(0,5,2,2) -> …
Run Code Online (Sandbox Code Playgroud)

c# algorithm quadtree

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

有效地将对象矩阵复制到更大的对象矩阵

我正在编写一个类似四叉树的数据结构,其中包含通用对象的矩阵T.如果四个子节点都包含已定义的矩阵T,我将把它们聚合成一个更大的矩阵,然后删除子节点.有没有比循环遍历每个引用并将其复制更有效的方法?我可以复制大块内存吗?


例:

T[,] _leaf1 = new T[64,64];
T[,] _leaf2 = new T[64,64];
T[,] _leaf3 = new T[64,64];
T[,] _leaf4 = new T[64,64];

// Populate leafs

T[,] _root = new T[128,128];

CopyInto(ref _root, ref _leaf1, 64, 64);
CopyInto(ref _root, ref _leaf2, 0, 64);
CopyInto(ref _root, ref _leaf3, 0, 0);
CopyInto(ref _root, ref _leaf4, 64, 0);
Run Code Online (Sandbox Code Playgroud)

c#

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

如何确定相似位数?

我需要比较两个数字,并在更重要的位中寻找相似之处.我正在尝试确定不同的最低有效位数.

10111000
10111011
Run Code Online (Sandbox Code Playgroud)

184和187要求偏移量为2,因为只有两个最低有效位不同.

10111011
11111011
Run Code Online (Sandbox Code Playgroud)

187和251要求偏移量为7,因为第七个最低有效位不同.

我的第一个想法是将数字异或,然后向右移位直到数字等于零.我觉得有一个更好的逐位解决方案,这不涉及循环,但我没有做足够的钻孔我自己提出它.

该解决方案需要适用于任何64位,因为我的数字存储为UInt64.这是用C#编写的,但解决方案很可能是与语言无关的解决方案.


11101101
11010101
Run Code Online (Sandbox Code Playgroud)

需要6位的偏移量.我试图找到多少相似的位,我可以脱颖而出.

algorithm bit-manipulation

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

是否有表示数字的值类型共享的接口?

我希望能够创建具有可变精度的各种结构.例如:

public struct Point<T> where T : INumber
{
    public T X;
    public T Y;

    public static Point<T> operator +(Point<T> p1, Point<T> p2)
    {
        return new Point<T>
                   {
                       X = p1.X+p2.X,
                       Y = p1.Y+p2.Y
                   };
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道Microsoft通过创建两个结构来处理这个问题 - Point(对于整数)和PointF(对于浮点数),但是如果你需要一个基于字节的点或双精度,那么你将被要求复制很多旧的代码,只是更改值类型.

c# generics

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

如何将命令行参数传递给已经运行的进程?

我正在编写一个联系人管理程序。我知道如何读取命令行参数,并根据发现的内容执行不同的方法。

例如,program.exe "John Doe"将启动该程序的新实例并打开它找到的名为John Doe的第一个联系人,program.exe -s John将启动该程序的新实例并搜索名为“ John”的联系人,而仅运行即可program.exe打开一个新的实例。带有空白搜索屏幕的程序。

但是,我只想运行该程序的单个实例。因此,当另一个程序调用时program.exe "John Doe",如果已经有一个进程在运行,则参数将传递给该进程并切换到新的搜索,而不是打开新的窗口。

我知道这需要寻找以前运行的进程和进程间的通信,但是我在.Net中都做不到很多,并且在正确的方向上入门或找到关于特定主题的任何好的教程都遇到了麻烦。

.net wcf

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

如何编写单个类以使用不同的数字类型进行多次编译?

我正在尝试编写处理不同数字类型的类.我知道C#(和我一般认为.Net)没有INumber接口,所以我不能使用如下内容:

    public class Adder<T> where T:INumber
    {
        public T Add(T a, T b)
        {
            return a + b;
        }
    }
Run Code Online (Sandbox Code Playgroud)

不过没关系,因为我想避免我的每个号码的装箱/拆箱.但是,我可以为我想支持的每种类型使用条件编译:

#if FLOAT 
    public class AdderF
    {
        public float Add(float a, float b)
#else
    public class Adder
    {
        public int Add(int a, int b)
#endif
        {
            return a + b;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这意味着我需要编写不同的Library.dllLibraryF.dll,但是.有没有更优雅的解决方案呢?

显然,在我的例子中,我可以简单地编写代码两次.但是,我想使用此过程来创建具有整数版本和浮点版本的大型复杂数据结构,因此在更新结构时不希望出现复制粘贴错误的可能性.我也不希望速度损失将浮点结构包装在一个整体包装器中,并且不必要地将所有输入转换为更宽松的数据类型.

.net c# conditional-compilation

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

异步触发的事件可以在窗体上同步运行吗?

[VS 2010 Beta与.Net Framework 3.5]

我编写了一个C#组件来异步监视套接字并在收到数据时引发事件.我设置VB表单以在引发事件时显示消息框.我注意到的是,当组件同步引发事件时,消息框会阻止组件代码并锁定表单,直到用户关闭消息.当它异步引发时,它既不会阻塞代码,也不会锁定表单.

我想要的是一种方式来引发一个事件,它不会阻塞代码,但是在与表单相同的线程上调用(这样它就会锁定表单直到用户选择一个选项.)

你能帮我吗?谢谢.

[零件]

using System;
using System.Threading;
using System.ComponentModel;

namespace mySpace
{
    public delegate void SyncEventHandler(object sender, SyncEventArgs e);
    public delegate void AsyncEventHandler(object sender, AsyncEventArgs e);

    public class myClass
    {
        readonly object syncEventLock = new object();
        readonly object asyncEventLock = new object();

        SyncEventHandler syncEvent;
        AsyncEventHandler asyncEvent;

        private delegate void WorkerDelegate(string strParam, int intParam);

        public void DoWork(string strParam, int intParam)
        {
            OnSyncEvent(new SyncEventArgs());
            AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(null);
            WorkerDelegate delWorker = new WorkerDelegate(ClientWorker);
            IAsyncResult result = …
Run Code Online (Sandbox Code Playgroud)

.net c# vb.net delegates asynchronous

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