- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
矩形点位自动排布算法研究
矩形点位自动排布算法研究
王朋武 darlingpeng@ 20/12, 2011
在游戏软件中的人员与机关排布、在粮库粮食温度测量时的监测杆布置以及各种与点位排布有关的软件编程中,如何根据需要快速自动地计算出各点位的坐标,是一个很重要的问题。近段时间我对此进行了一番研究,以下仅对此进行简单地阐述,希望会对有关人员有所帮助。
假设排布方式为矩形。
对排布条件做如下分类:
第一点位置可能在:
西北角
东北角
西南角
东南角
排列方式分为:
层叠形
蛇形
排列方向有:
横排
竖排
横梅花
竖梅花
说明:
层叠形是指点位排列时,每一行或列的数字排列方式都一样,具有重复性,如下图例:
蛇形是指点位排列时,整个行或列的数字连线就象蛇一样具有连续性,如下图例:
梅花形是指点位排列时,行或列的点处在其上下左右行或列中间的空隙位置,每一点四周都均匀地排列着六个点,就象梅花一样。如下图例:
由于在计算过程中的浮点数到整数变换时造成的累积误差,所以添加可调整各点间距以及整体位移的上下左右四个方向控件,进行点位调整。
程序用Delphi 7编制。
程序不算复杂,在此我列出需要的主要程序源码,并把有关界面图拷屏贴出来,方便大家参考。布点范围:500×500。
{*****************************************
作者:王朋武
时间:30/11, 2011
说明:重新排列点位
******************************************}
procedure Tfrm_poleloc.btn_arrangeClick(Sender: TObject);
var
i, j, m, n, k, x0, y0, x, y, p, q, r, w, t: Integer;
h, v: Integer;
str_name: String;
begin
if not gbx_arrange.Visible then exit;
m := 5;
if edt_row.Text then m := edt_row.Value;
if (cmb_dir.Text = ‘横梅花’) or (cmb_dir.Text = ‘竖梅花’) then
begin
i := 1;
k := 0;
while k = a_room.i_poles do
begin
if i mod 2 = 1 then
k := k + m
else
k := k + m - 1;
i := i + 1;
end;
n := i - 1;
end else
n := Math.Ceil(a_room.i_poles / m);
if cmb_dir.Text = ‘横梅花’ then
begin
t := m;
m := n;
n := t;
end;
k := m;
if n m then k := n;
q := Math.Floor((490 - 20 * k) / (k - 1)); //圆外轮廓间距
if q 0 then q := 0;
if q = 0 then
begin //不可再增减
ii_h := 0;
ii_v := 0;
end;
p := 20 + q; //圆间距
h := p + ii_h;
v := p + ii_v;
if m n then
begin
if cmb_first.Text = ‘西北角’ then
begin
x0 := Math.Floor((490 - h * n + q) / 2) + ii_ho;
y0 := 5 - Math.Floor((m-1) / 2) * ii_v - ii_ve;
end else if cmb_first.Text = ‘西南角’ then
begin
x0 := Math.Floor((490 - h * n + q) / 2) + ii_ho;
y0 := 475 + Math.Floor((m-1) / 2) * ii_v - ii_ve;
end else if cmb_first.Text = ‘东北角’ then
begin
x0 := Math.Floor((490 + h * n - q) /
文档评论(0)