A very jank circle algorithm that overdraws many of the lines but mostly works.
This commit is contained in:
parent
d4b6c35120
commit
d916d1c383
5 changed files with 93 additions and 8 deletions
|
@ -5,7 +5,7 @@
|
||||||
"PLAYER_TILE": "\ua66b",
|
"PLAYER_TILE": "\ua66b",
|
||||||
"ENEMY_TILE": "\u1d5c",
|
"ENEMY_TILE": "\u1d5c",
|
||||||
"BG_TILE": "█",
|
"BG_TILE": "█",
|
||||||
"WATER_TILE": "\u26c6"
|
"WATER_TILE": "\u224b"
|
||||||
},
|
},
|
||||||
"enemy": {
|
"enemy": {
|
||||||
"HEARING_DISTANCE": 8
|
"HEARING_DISTANCE": 8
|
||||||
|
|
52
matrix.cpp
52
matrix.cpp
|
@ -179,6 +179,58 @@ namespace matrix {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
circle::circle(Point center, int radius) :
|
||||||
|
center(center), radius(radius)
|
||||||
|
{
|
||||||
|
xi = 0;
|
||||||
|
yi = radius;
|
||||||
|
m = 5 - 4 * radius;
|
||||||
|
step = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void circle::update() {
|
||||||
|
if(m > 0) {
|
||||||
|
yi--;
|
||||||
|
m -= 8 * yi;
|
||||||
|
}
|
||||||
|
xi++;
|
||||||
|
m += 8 * xi + 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool circle::next() {
|
||||||
|
if(xi <= yi) {
|
||||||
|
switch(step % 4) {
|
||||||
|
case 0:
|
||||||
|
x0 = center.x - xi;
|
||||||
|
y = center.y - yi;
|
||||||
|
x1 = center.x + xi;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
x0 = center.x - yi;
|
||||||
|
y = center.y - xi;
|
||||||
|
x1 = center.x + yi;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
x0 = center.x - yi;
|
||||||
|
y = center.y + xi;
|
||||||
|
x1 = center.x + yi;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
x0 = center.x - xi;
|
||||||
|
y = center.y + yi;
|
||||||
|
x1 = center.x + xi;
|
||||||
|
update();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
step++;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void dump(const std::string &msg, Matrix &map, int show_x, int show_y) {
|
void dump(const std::string &msg, Matrix &map, int show_x, int show_y) {
|
||||||
println("----------------- {}", msg);
|
println("----------------- {}", msg);
|
||||||
|
|
||||||
|
|
16
matrix.hpp
16
matrix.hpp
|
@ -108,4 +108,20 @@ namespace matrix {
|
||||||
line(Point start, Point end);
|
line(Point start, Point end);
|
||||||
bool next();
|
bool next();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct circle {
|
||||||
|
Point center;
|
||||||
|
int radius = 0;
|
||||||
|
int xi = 0;
|
||||||
|
int yi = 0;
|
||||||
|
int m = 0;
|
||||||
|
int step = 0;
|
||||||
|
int x0;
|
||||||
|
int x1;
|
||||||
|
int y;
|
||||||
|
|
||||||
|
circle(Point center, int radius);
|
||||||
|
void update();
|
||||||
|
bool next();
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,23 +5,18 @@ TODAY'S GOAL:
|
||||||
* Flame pillars icon \u2e3e
|
* Flame pillars icon \u2e3e
|
||||||
* Room should always be found.
|
* Room should always be found.
|
||||||
|
|
||||||
* Change the test matrix to be irregular dimensions.
|
|
||||||
* Study https://github.com/hirdrac/gx_lib/blob/main/gx/Unicode.hh
|
* Study https://github.com/hirdrac/gx_lib/blob/main/gx/Unicode.hh
|
||||||
* Study this https://en.cppreference.com/w/cpp/language/explicit
|
* Study this https://en.cppreference.com/w/cpp/language/explicit
|
||||||
* Study https://en.cppreference.com/w/cpp/language/member_functions#Special_member_functions
|
* Study https://en.cppreference.com/w/cpp/language/member_functions#Special_member_functions
|
||||||
|
|
||||||
* Light should flood using the dijkstra map rather than use a box.
|
|
||||||
|
|
||||||
-1. Learn std::initializer_list by using it.
|
-1. Learn std::initializer_list by using it.
|
||||||
0. \ua3fd causes the character immediately after to vanish. Make a test and solve it.
|
0. \ua3fd causes the character immediately after to vanish. Make a test and solve it.
|
||||||
1. Why do Sliders only have to be kept around forever and can't go in containers like everything else?
|
1. Why do Sliders only have to be kept around forever and can't go in containers like everything else?
|
||||||
|
|
||||||
* Make a for-loop generator thing, and figure out whatever this magic matrix-processing-without-for-loops tech is (that probably doesn't exist).
|
|
||||||
|
|
||||||
"you could make an iterator type that you create with the Matrix & a box - then it iterates though each row/column and updates its x/y values. More code over all but loops like you're doing now could be simpler"
|
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
|
|
||||||
|
* Add a char lookup input to the designer.
|
||||||
|
|
||||||
* Make the light directional.
|
* Make the light directional.
|
||||||
|
|
||||||
* Hot key for debug view.
|
* Hot key for debug view.
|
||||||
|
|
|
@ -224,3 +224,25 @@ TEST_CASE("prototype line algorithm", "[matrix:line]") {
|
||||||
REQUIRE(f_found);
|
REQUIRE(f_found);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("prototype circle algorithm", "[matrix:circle]") {
|
||||||
|
size_t width = Random::uniform<size_t>(10, 13);
|
||||||
|
size_t height = Random::uniform<size_t>(10, 15);
|
||||||
|
Map map(width,height);
|
||||||
|
// create a target for the paths
|
||||||
|
Point start{.x=map.width() / 2, .y=map.height()/2};
|
||||||
|
|
||||||
|
for(int radius = 2; radius < 5; radius++) {
|
||||||
|
// use an empty map
|
||||||
|
Matrix result = map.walls();
|
||||||
|
|
||||||
|
for(matrix::circle it{start, radius}; it.next();) {
|
||||||
|
println("y={}, x0={}, x1={}", it.y, it.x0, it.x1);
|
||||||
|
for(int i = it.x0; i < it.x1; i++) {
|
||||||
|
result[it.y][i] += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
matrix::dump("RESULT AFTER CIRCLE", result, start.x, start.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue