zoukankan      html  css  js  c++  java
  • [原]拼接菱形的冲突判定方法(二)

    上次我尝试 从 坐标轴映射, 或者说是数学分析的方法判定冲突, 但是很难做到, 因为 难以计算点在仿射坐标系的投影, 并且也有一定精度问题


    下面采用 离散的方式:

    首先对于一个拼接菱形的话, 如果我们假设它的位置是离散化的, 如下图:

    只能允许菱形和菱形之间的边是对齐的,

    而不能出现有错位的情况


    如何避免这种情况呢, 有一种方法:

    我们可以把整个背景离散化, 根据单位菱形的宽度的一半sizeX 和高度的一半 把整个背景网格化, 同时要求每个拼接菱形 的包围矩形的左上点 和这个网格点对齐



    每个拼接菱形 在水平移动的时候,每次跨动两个单位, 垂直移动的时候, 每次跨动 2个单位, 

    而斜着移动的时候,水平跨越1个单位, 垂直跨越1个单位 如图:

    为了满足这个条件, 避免出现两个菱形只有一半相交的情况,  首先如何表示坐标;

    既然是离散化的我们可以采用两个整数 作为 天然的坐标 x, y

    只要保证x  y 的奇偶 性相同(或者时刻相反), 就可以满足上面的移动规律。


    我们需要把一个拼接菱形所有的占据的块计算出来, 已知左上角 为 x, y 编号

    那么 根据上一篇文章中的结论, 拼接菱形最上面的点的编号是:(sx, sy 是拼接菱形的宽度和高度)

    (x+ sy,  y)

    for i  < sx

       for j < sy

    开始遍历每一个方块, 根据定义, 向右x正方向, 向 下 y正方向

    菱形x方向移动, 则initX+1 initY+1

    y方向移动, initX-1 initY+1

    这样就能得到所有块的编号


    采用一个哈希表存储, 键值是x*10000+y   值是一个数组包含所有占用该块的建筑 序列


    下一章我们描述如果进行冲突判定




    作者:liyong748 发表于2012/5/20 14:11:49 原文链接
    阅读:201 评论:0 查看评论
  • 相关阅读:
    九度oj题目1019:简单计算器
    九度oj题目1555:重复子串
    Java泛型
    Remove Duplicates from Sorted Array
    Add Binary
    Plus One
    Remove Element
    Remove Nth Node From End of List
    Longest Common Prefix
    Roman to Integer
  • 原文地址:https://www.cnblogs.com/liyonghelpme/p/4273576.html
Copyright © 2011-2022 走看看