- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在尝试使用 bresenham 线算法绘制一些有角度的线,该算法可以循环大小为 21x21 的二维数组,作为从 0 - 2pi 倾斜的线。
所以这个想法是程序必须输出线在网格中经过的值..
以 5x5 为例
Angle:0
_ _ _ _ _
|_|_|_|_|_|
|_|_|_|_|_|
|_|_|.|.|.|
|_|_|_|_|_|
|_|_|_|_|_|
Angle: 45
_ _ _ _ _
|_|_|_|_|.|
|_|_|_|.|_|
|_|_|.|_|_|
|_|_|_|_|_|
|_|_|_|_|_|
等等..
这里的问题是它看起来不像我的程序那样做..端点位于给定的半径长度内..
我确信我搞砸了数学..所以我希望你们中的一些人能在这里帮助我..
#include <iostream>
#include <math.h>
using namespace std;
typedef std::pair<int,int> coordinate;
int sign(double x ){ return (x > 0) ? 1 : ((x < 0) ? -1 : 0); }
coordinate endpoint(double angle, int x1 , int y1, int lenght)
{
double radians = (M_PI/180)*angle;
double x2 = x1 + (lenght * cos(radians));
double y2 = y1 + (lenght * sin(radians));
return std::make_pair(round(x2),round(y2));
}
void bresenham(coordinate start, coordinate end)
{
//restriction a.x < b.x and 0 < H/W < 1
int y = start.second;
int w = end.first - start.first;
int h = end.second - start.second;
int f = 2*h-w; // current error term
for (int x = start.first; x<= end.first; x++)
{
cout << "mark: " << x << "," << y << endl;
if (f < 0)
{
f = f + 2*h;
}
else
{
y++;
f=f+2*(h-w);
}
}
}
int main(int argc, const char * argv[])
{
coordinate start = make_pair(0,0);
for (int i = 0; i <= 45; i++)
{
coordinate end = endpoint(i,0,0,10);
cout << " endPos: "<< "(" << end.first <<"," << end.second <<")" << " Angle: " << i << " " << endl;
cout << "--------------------------------------------" << endl;
bresenham(start, end);
cout << "--------------------------------------------" << endl;
}
return 0;
}
这是输出。
endPos: (10,0) Angle: 0
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,0
mark: 4,0
mark: 5,0
mark: 6,0
mark: 7,0
mark: 8,0
mark: 9,0
mark: 10,0
--------------------------------------------
endPos: (10,0) Angle: 1
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,0
mark: 4,0
mark: 5,0
mark: 6,0
mark: 7,0
mark: 8,0
mark: 9,0
mark: 10,0
--------------------------------------------
endPos: (10,0) Angle: 2
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,0
mark: 4,0
mark: 5,0
mark: 6,0
mark: 7,0
mark: 8,0
mark: 9,0
mark: 10,0
--------------------------------------------
endPos: (10,1) Angle: 3
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,0
mark: 4,0
mark: 5,1
mark: 6,1
mark: 7,1
mark: 8,1
mark: 9,1
mark: 10,1
--------------------------------------------
endPos: (10,1) Angle: 4
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,0
mark: 4,0
mark: 5,1
mark: 6,1
mark: 7,1
mark: 8,1
mark: 9,1
mark: 10,1
--------------------------------------------
endPos: (10,1) Angle: 5
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,0
mark: 4,0
mark: 5,1
mark: 6,1
mark: 7,1
mark: 8,1
mark: 9,1
mark: 10,1
--------------------------------------------
endPos: (10,1) Angle: 6
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,0
mark: 4,0
mark: 5,1
mark: 6,1
mark: 7,1
mark: 8,1
mark: 9,1
mark: 10,1
--------------------------------------------
endPos: (10,1) Angle: 7
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,0
mark: 4,0
mark: 5,1
mark: 6,1
mark: 7,1
mark: 8,1
mark: 9,1
mark: 10,1
--------------------------------------------
endPos: (10,1) Angle: 8
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,0
mark: 4,0
mark: 5,1
mark: 6,1
mark: 7,1
mark: 8,1
mark: 9,1
mark: 10,1
--------------------------------------------
endPos: (10,2) Angle: 9
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,1
mark: 4,1
mark: 5,1
mark: 6,1
mark: 7,1
mark: 8,2
mark: 9,2
mark: 10,2
--------------------------------------------
endPos: (10,2) Angle: 10
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,1
mark: 4,1
mark: 5,1
mark: 6,1
mark: 7,1
mark: 8,2
mark: 9,2
mark: 10,2
--------------------------------------------
endPos: (10,2) Angle: 11
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,1
mark: 4,1
mark: 5,1
mark: 6,1
mark: 7,1
mark: 8,2
mark: 9,2
mark: 10,2
--------------------------------------------
endPos: (10,2) Angle: 12
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,1
mark: 4,1
mark: 5,1
mark: 6,1
mark: 7,1
mark: 8,2
mark: 9,2
mark: 10,2
--------------------------------------------
endPos: (10,2) Angle: 13
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,1
mark: 4,1
mark: 5,1
mark: 6,1
mark: 7,1
mark: 8,2
mark: 9,2
mark: 10,2
--------------------------------------------
endPos: (10,2) Angle: 14
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,0
mark: 3,1
mark: 4,1
mark: 5,1
mark: 6,1
mark: 7,1
mark: 8,2
mark: 9,2
mark: 10,2
--------------------------------------------
endPos: (10,3) Angle: 15
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,1
mark: 3,1
mark: 4,1
mark: 5,2
mark: 6,2
mark: 7,2
mark: 8,2
mark: 9,3
mark: 10,3
--------------------------------------------
endPos: (10,3) Angle: 16
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,1
mark: 3,1
mark: 4,1
mark: 5,2
mark: 6,2
mark: 7,2
mark: 8,2
mark: 9,3
mark: 10,3
--------------------------------------------
endPos: (10,3) Angle: 17
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,1
mark: 3,1
mark: 4,1
mark: 5,2
mark: 6,2
mark: 7,2
mark: 8,2
mark: 9,3
mark: 10,3
--------------------------------------------
endPos: (10,3) Angle: 18
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,1
mark: 3,1
mark: 4,1
mark: 5,2
mark: 6,2
mark: 7,2
mark: 8,2
mark: 9,3
mark: 10,3
--------------------------------------------
endPos: (9,3) Angle: 19
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,1
mark: 3,1
mark: 4,1
mark: 5,2
mark: 6,2
mark: 7,2
mark: 8,3
mark: 9,3
--------------------------------------------
endPos: (9,3) Angle: 20
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,1
mark: 3,1
mark: 4,1
mark: 5,2
mark: 6,2
mark: 7,2
mark: 8,3
mark: 9,3
--------------------------------------------
endPos: (9,4) Angle: 21
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,1
mark: 3,1
mark: 4,2
mark: 5,2
mark: 6,3
mark: 7,3
mark: 8,4
mark: 9,4
--------------------------------------------
endPos: (9,4) Angle: 22
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,1
mark: 3,1
mark: 4,2
mark: 5,2
mark: 6,3
mark: 7,3
mark: 8,4
mark: 9,4
--------------------------------------------
endPos: (9,4) Angle: 23
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,1
mark: 3,1
mark: 4,2
mark: 5,2
mark: 6,3
mark: 7,3
mark: 8,4
mark: 9,4
--------------------------------------------
endPos: (9,4) Angle: 24
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,1
mark: 3,1
mark: 4,2
mark: 5,2
mark: 6,3
mark: 7,3
mark: 8,4
mark: 9,4
--------------------------------------------
endPos: (9,4) Angle: 25
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,1
mark: 3,1
mark: 4,2
mark: 5,2
mark: 6,3
mark: 7,3
mark: 8,4
mark: 9,4
--------------------------------------------
endPos: (9,4) Angle: 26
--------------------------------------------
mark: 0,0
mark: 1,0
mark: 2,1
mark: 3,1
mark: 4,2
mark: 5,2
mark: 6,3
mark: 7,3
mark: 8,4
mark: 9,4
--------------------------------------------
endPos: (9,5) Angle: 27
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,1
mark: 3,2
mark: 4,2
mark: 5,3
mark: 6,3
mark: 7,4
mark: 8,4
mark: 9,5
--------------------------------------------
endPos: (9,5) Angle: 28
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,1
mark: 3,2
mark: 4,2
mark: 5,3
mark: 6,3
mark: 7,4
mark: 8,4
mark: 9,5
--------------------------------------------
endPos: (9,5) Angle: 29
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,1
mark: 3,2
mark: 4,2
mark: 5,3
mark: 6,3
mark: 7,4
mark: 8,4
mark: 9,5
--------------------------------------------
endPos: (9,5) Angle: 30
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,1
mark: 3,2
mark: 4,2
mark: 5,3
mark: 6,3
mark: 7,4
mark: 8,4
mark: 9,5
--------------------------------------------
endPos: (9,5) Angle: 31
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,1
mark: 3,2
mark: 4,2
mark: 5,3
mark: 6,3
mark: 7,4
mark: 8,4
mark: 9,5
--------------------------------------------
endPos: (8,5) Angle: 32
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,1
mark: 3,2
mark: 4,3
mark: 5,3
mark: 6,4
mark: 7,4
mark: 8,5
--------------------------------------------
endPos: (8,5) Angle: 33
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,1
mark: 3,2
mark: 4,3
mark: 5,3
mark: 6,4
mark: 7,4
mark: 8,5
--------------------------------------------
endPos: (8,6) Angle: 34
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,2
mark: 3,2
mark: 4,3
mark: 5,4
mark: 6,5
mark: 7,5
mark: 8,6
--------------------------------------------
endPos: (8,6) Angle: 35
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,2
mark: 3,2
mark: 4,3
mark: 5,4
mark: 6,5
mark: 7,5
mark: 8,6
--------------------------------------------
endPos: (8,6) Angle: 36
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,2
mark: 3,2
mark: 4,3
mark: 5,4
mark: 6,5
mark: 7,5
mark: 8,6
--------------------------------------------
endPos: (8,6) Angle: 37
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,2
mark: 3,2
mark: 4,3
mark: 5,4
mark: 6,5
mark: 7,5
mark: 8,6
--------------------------------------------
endPos: (8,6) Angle: 38
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,2
mark: 3,2
mark: 4,3
mark: 5,4
mark: 6,5
mark: 7,5
mark: 8,6
--------------------------------------------
endPos: (8,6) Angle: 39
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,2
mark: 3,2
mark: 4,3
mark: 5,4
mark: 6,5
mark: 7,5
mark: 8,6
--------------------------------------------
endPos: (8,6) Angle: 40
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,2
mark: 3,2
mark: 4,3
mark: 5,4
mark: 6,5
mark: 7,5
mark: 8,6
--------------------------------------------
endPos: (8,7) Angle: 41
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,2
mark: 3,3
mark: 4,4
mark: 5,4
mark: 6,5
mark: 7,6
mark: 8,7
--------------------------------------------
endPos: (7,7) Angle: 42
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,2
mark: 3,3
mark: 4,4
mark: 5,5
mark: 6,6
mark: 7,7
--------------------------------------------
endPos: (7,7) Angle: 43
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,2
mark: 3,3
mark: 4,4
mark: 5,5
mark: 6,6
mark: 7,7
--------------------------------------------
endPos: (7,7) Angle: 44
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,2
mark: 3,3
mark: 4,4
mark: 5,5
mark: 6,6
mark: 7,7
--------------------------------------------
endPos: (7,7) Angle: 45
--------------------------------------------
mark: 0,0
mark: 1,1
mark: 2,2
mark: 3,3
mark: 4,4
mark: 5,5
mark: 6,6
mark: 7,7
--------------------------------------------
我做错了什么?...我知道可能必须修改 bresenham 算法以克服大于 1 和小于 0 的斜率。
--更新澄清问题--
我正在尝试使用 bresenham 线算法以循环方式迭代二维数组。
该算法应从二维阵列的中心开始,并以 0 - 2pi 之间的角度“射出”光束。光束必须从中心开始到矩阵的边缘结束,希望它更有意义..
_ _ _ _ _ _ _ _ _ _ _
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|.|.|.|.|.|.|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
_ _ _ _ _ _ _ _ _ _ _
|_|_|_|_|_|_|_|_|_|.|.|
|_|_|_|_|_|_|_|_|.|_|_|
|_|_|_|_|_|_|_|.|_|_|_|
|_|_|_|_|_|_|.|_|_|_|_|
|_|_|_|_|_|.|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
最佳答案
您只有第一个八分圆的 Bresenham (dx>=0,dy>=0,dx>=dy)
所以当你在外面使用角度时 <0,45>
度将无法正常工作。你有更多的选择来解决这个问题:
( dx>=0, dx<0 combined with dy>=0, dy<0)
( |dx|>=|dy|, |dx|<|dy| )
这里不是 x++,y++,x--,y--
使用 x+=sx,y+=sy
而不是sx,sy
是插值前预先计算的步长方向。 (在 asm 中通常使用可自动修改的常量,但在 C/C++ 中你需要为此使用变量)不要忘记将具有较大绝对变化的轴用作主插值轴 所以如果(|dx|>=|dy|)
主轴是x
这意味着 x
在每个 for
中递增(dec)通过和 y
仅在 if
声明...
端点错误
正如 Nico Schertler 指出的那样,端点是错误的。使用矩阵较大的一半大小作为半径,并更改 bresenham 插值以在 x
时停止。或 y
超出矩阵范围...
另一种选择是将主轴设置为矩阵的边缘(取决于八分圆)并通过 sin
计算第二个轴或 cos
(是90
度三角形)
关于c++ - 使用 bresenham 线算法循环二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34157049/
我正在尝试为 2D 方 block 游戏编写一个闪电引擎。与大多数游戏一样,我在 map 上有一个 map [][]和一个光照贴图[][]。没什么特别的。从一个光点,我在灯光范围内画一个圆圈,并尝试将
我已经实现了 Bresenham 圆算法。但这段代码只输出一个白色窗口。不绘制圆边界的单个像素。 该函数绘制 8 个对称点。 void plot_point(int x, int y, int xc,
我正在尝试使用 Bresenham 算法在 C 语言中画一条线。我在 Windows 7 的 dosbox 中使用 turbo C++ 来实现此代码。编译时我没有收到任何错误,但是当我运行代码时程序在
我有以下代码 bresenham's algorithm表示适用于 Scala Java 代码。 def bresenham(x0: Int, y0: Int, x1: Int, y1: Int) =
我正在寻找这种行为 http://www.brainjunkie.com/web/js-wordsearch/但有了这个盒子: div { display: inline-block; wid
代码在第一次调用 positionGenerator(1046,1623,750,1290); 时运行良好,但在第二次调用 positionGenerator(1046,1623,375,810);
我试图用星星(*)填充矩阵来绘制布雷森汉姆线,但是当我打印出这个东西时,矩阵只填充了一颗星星,我不知道出了什么问题。语言是Java public class PtLine extends Vector
我正在尝试使用 Bresenham's Line Drawing Algorithm在 20x20 的瓷砖网格上画一条线。 所以基本上,当变量 deltaerror(来自 wiki)大于 1(当 y
我创建了一个函数,它接受一个 2D std::vector, vector 中的 2 个点,并在 vector 中“绘制”一条线。但是,它并不涵盖所有情况(八分圆)。一条线是指在一条直线上相互连接的点
Bresenham 的浮点算法中有些东西让我很烦。 算法如下: void line(x0, x1, y0, y1) { int deltax = x1 - x0; int deltay = y
我编写了这段代码。这段代码处理 dx 和 dy 大于 0 的情况。但是当其中一个小于 0 时该怎么办。算法说 m 应该作为绝对值,x 和 y 应该递减。但是如何在第二个 for 循环中递减 i(x)?
https://www.geeksforgeeks.org/bresenhams-circle-drawing-algorithm/ 我正在查看 Bresenham 的算法,我试图用它来制作 MS 绘
我正在使用中点圆算法(也称为 Bresenham 算法)来绘制同心圆。每个圆的半径与下一个圆的半径之差始终为 1,因此最终结果应该是一个完整的圆形区域。 但是,如附图所示,一些像素留空。 我正在使用
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有以下绘制圆的代码: #include #include #include #include void main() { int xc, yc, x, y, p[100], r, k;
我有一个练习,我想用 Bressenham 算法画一条线。问题是它对向下和向右的线路非常有效,但是当线路向上或向后时,它就不再工作了......有人可以帮助我吗? void draw_line(
我在 HTML Canvas 上画线,并使用不太精确的二维数组(表示 10x10 像素的 block ),我在其中使用 Bresenham 算法“画”线以存储线 ID,因此我可以使用该数组查看选择了哪
嗨,我正在尝试编写一些基本代码来实现 Bresenham 算法,但我一直在尝试使用 round和/ 。我的代码是: bresenhamAlgorithm :: Coord -> Coord -> In
我编写了一个小程序,它根据用户输入 x1,y1 和 x2,y2 绘制一条线。由于某种原因,线条只能在水平时起作用,但是一旦线条应该是垂直的,它只会向我显示黑色像素而不是线条。我已经检查了所有内容,并且
我有一个像素 电话 在网格上。我想知道该像素是否会出现在 bresenham 上之间生成的线P0 和 P1 没有实际生成线。这有可能提出这样的决定因素吗? 最佳答案 我正在写这个作为答案,即使它只是一
我是一名优秀的程序员,十分优秀!