I create Quad tree code . I want to get 10 point from database and put them in Quad tree’s leaves but it doesn’t work correctly.for example random point is (449.6745,411.1505) and range detected is 88 < x < 89 and 411 < y < 412 but it isn’t correct . range should be 449 < x < 450 and 411 < y < 412 . Thanks Here is my code:
public class QuadTree
{
public TreeNode MainRoot;
bool Switch = false;
public QuadTree(Rectangle R)
{
MainRoot = new TreeNode();
MainRoot.Rectangle = R;
MainRoot.LeftChild = null;
MainRoot.RightChild = null;
}
public void CreateTree(TreeNode Root, Rectangle R, bool Switch)
{
if (Root.Rectangle.Width <=1 && Root.Rectangle.Height <=1 )
{
return;
}
Root.LeftChild = new TreeNode();
Root.RightChild = new TreeNode();
if (!Switch)
{
Root.LeftChild.Rectangle = new Rectangle(R.X, R.Y, R.Width / 2, R.Height);
Root.RightChild.Rectangle = new Rectangle(R.X + R.Width / 2, R.Y, R.Width / 2, R.Height);
}
if (Switch)
{
Root.LeftChild.Rectangle = new Rectangle(R.X, R.Y, R.Width, R.Height / 2);
Root.RightChild.Rectangle = new Rectangle(R.X, R.Y - R.Height / 2, R.Width, R.Height / 2);
}
CreateTree(Root.LeftChild, Root.LeftChild.Rectangle, !Switch);
CreateTree(Root.RightChild, Root.RightChild.Rectangle, !Switch);
}
//*****************************************************************************************
double x, y;
public void SearchPoint(TreeNode Root)
{
bool sw = false;
SqlConnection scon = new SqlConnection("Data Source=GATEWAY-PC;Initial Catalog=QuadTree;Integrated Security=True");
scon.Open();
SqlCommand scom = new SqlCommand("delete from PointArea", scon);
scom.ExecuteNonQuery();
for (int i = 1; i <= 10; i++)
{
TreeNode Current = new TreeNode();
TreeNode T = new TreeNode();
T = Root;
Current = Root;
SqlDataReader s = new SqlCommand("select X,Y from Coordinate where ID='" + i + "'", scon).ExecuteReader();
while (s.Read())
{
x = Convert.ToDouble(s["X"]);
y = Convert.ToDouble(s["Y"]);
}
s.Close();
while (Current != null /*&& (Current.Rectangle.Width > 1 || Root.Rectangle.Height > 1)*/)
{
if (!sw)
{
if (x >= Current.Rectangle.X && x <= (Current.Rectangle.X + Current.Rectangle.Width / 2))
{
T = Current;
Current = Current.LeftChild;
}
else if (x >= (Current.Rectangle.X + Current.Rectangle.Width / 2) && x <= Current.Rectangle.X + Current.Rectangle.Width)
{
T = Current;
Current = Current.RightChild;
}
}
if (sw)
{
if (y <= Current.Rectangle.Y && y >= (Current.Rectangle.Y - Current.Rectangle.Height / 2))
{
T = Current;
Current = Current.LeftChild;
}
else if (y <= (Current.Rectangle.Y - Current.Rectangle.Height / 2) && y >= Current.Rectangle.Y - Current.Rectangle.Height)
{
T = Current;
Current = Current.RightChild;
}
}
sw = !sw;
}
SqlCommand sq = new SqlCommand("insert into PointArea values('" + i + "','" + T.Rectangle.X + "','" + (T.Rectangle.X + T.Rectangle.Width) + "','" + (T.Rectangle.Y - T.Rectangle.Height) + "' ,'" + T.Rectangle.Y + "')", scon);
sq.ExecuteNonQuery();
T.PointX = x;
T.PointY = y;
}
scon.Close();
}


0 comments