public class KDTreeNode
{
/// <summary>
/// 分裂点
/// </summary>
public Point DivisionPoint { get; set; }
/// <summary>
/// 分裂类型
/// </summary>
public EnumDivisionType DivisionType { get; set; }
/// <summary>
/// 左子节点
/// </summary>
public KDTreeNode LeftChild { get; set; }
/// <summary>
/// 右子节点
/// </summary>
public KDTreeNode RightChild { get; set; }
}
private KDTreeNode CreateTreeNode(List<Point> pointList)
{
if (pointList.Count > 0)
{
// 计算方差
double xObtainVariance = ObtainVariance(CreateXList(pointList));
double yObtainVariance = ObtainVariance(CreateYList(pointList));
// 根据方差确定分裂维度
EnumDivisionType divisionType = SortListByXOrYVariances(xObtainVariance, yObtainVariance, ref pointList);
// 获得中位数
Point medianPoint = ObtainMedian(pointList);
int medianIndex = pointList.Count / 2;
// 构建节点
KDTreeNode treeNode = new KDTreeNode()
{
DivisionPoint = medianPoint,
DivisionType = divisionType,
LeftChild = CreateTreeNode(pointList.Take(medianIndex).ToList()),
RightChild = CreateTreeNode(pointList.Skip(medianIndex + 1).ToList())
};
return treeNode;
}
else
{
return null;
}
}
public Point FindNearest(Point searchPoint)
{
// 按照查找方式寻找最近点
Point nearestPoint = DFSSearch(this.rootNode, searchPoint);
// 进行回溯
return BacktrcakSearch(searchPoint, nearestPoint);
}
private Point DFSSearch(KDTreeNode node,Point searchPoint,bool pushStack = true)
{
if(pushStack == true)
{
// 利用堆栈记录查询的路径,由于树节点中没有记载父节点的原因
backtrackStack.Push(node);
}
if (node.DivisionType == EnumDivisionType.X)
{
return DFSXsearch(node,searchPoint);
}
else
{
return DFSYsearch(node, searchPoint);
}
}
private Point BacktrcakSearch(Point searchPoint,Point nearestPoint)
{
// 如果记录路径的堆栈为空则表示已经回溯到根节点,则查到的最近点就是真正的最近点
if (backtrackStack.IsEmpty())
{
return nearestPoint;
}
else
{
KDTreeNode trackNode = backtrackStack.Pop();
// 分别求回溯点与最近点距查找点的距离
double backtrackDistance = ObtainDistanFromTwoPoint(searchPoint, trackNode.DivisionPoint);
double nearestPointDistance = ObtainDistanFromTwoPoint(searchPoint, nearestPoint);
if (backtrackDistance < nearestPointDistance)
{
// 深拷贝节点的目的是为了避免损坏树
KDTreeNode searchNode = new KDTreeNode()
{
DivisionPoint = trackNode.DivisionPoint,
DivisionType = trackNode.DivisionType,
LeftChild = trackNode.LeftChild,
RightChild = trackNode.RightChild
};
nearestPoint = DFSBackTrackingSearch(searchNode, searchPoint);
}
// 递归到根节点
return BacktrcakSearch(searchPoint, nearestPoint);
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有