|
Randor wrote: I would recommend testing this stuff on your desktop and get out of that restrained environment during the test development.
That's actually part of why I wrote GFX to be runnable anywhere. I didn't want to develop it on a constrained environment. But it has to run on them.
My initial GFX library dumped its output solely using printf() and drawing ascii art after converting bitmaps to 16 color grayscale.
I used that to test my line drawing algorithms and such.
But now that all of that is done and pretty predictable, I find myself going back to the PC to code this thing less and less, either because I'm dealing with things like asynchronous draws which have no support on the PC, or most of what I'm doing works the first time or two after it compiles because i've built the foundation up by now enough that the coding is fairly high level.
Real programmers use butterflies
|
|
|
|
|
Okay, so I implemented it and what jumps out to me (and I feel like I'm missing something here) is that for me to use even-odd requires a nasty brute force when trying to fill.
here's rough C++ psuedocode i just typed to illustrate:
for(int y=0;y<height;++y) {
for(int x=0;x<width;++x) {
if(even_odd_is_point_in_poly(x,y,path,path_size)) {
draw_pixel(x,y,color);
}
}
}
Does that look right to you? It seems heavy handed to me. The wiki entry only shows how to determine if the point is in the polygon though, not how to quickly determine the extents by say, scanline. I feel like there has to be a faster way.
I just figured it out I think.
Real programmers use butterflies
modified 31-May-21 1:51am.
|
|
|
|
|
Hmmmm,
Of course there are faster ways. I would recommend getting your polygon algorithms working first and then move towards optimization. Obviously writing single pixels one at a time will be low performance. Writing sizeof(int) would be faster and SIMD instructions even faster. Same goes for whatever array you are using to store your polygon points.
'sparse' std::bitset would be lowest memory usage but slow as molasses.
std::bitset would be low memory but a little bit faster.
A huge array of quadword zeros and ones read with SIMD... fast and fat
Pick your poison.
|
|
|
|
|
I can't use the STL because it's pretty much non-existent on the arduino for anything non-trivial. Part of the reason is due to supporting 8 bit processors and all the constraints that usually come with them. The STL doesn't play well with 8kB of RAM. It's not that it won't work, it's just not really great for that, and if you only have 256kB of nvs program space to work with.
Because of that I've had to hand roll things like std::is_same<>
I can't do anything that specifically targets SIMD, because although some of the processors I target do support those instructions, there is no unified way to target it other than to cajole the C++ compiler into generating the right machine code. Frankly, I don't even know what SIMD looks like on, say a 32-bit Tensilica chip but I know it supports it in some form. Same with ARM Cortex CPUs.
I'm currently using run lengths so that I draw horizontal scanlines at a time. That cuts down device traffic (often SPI bus traffic), since I can almost always fill a rectangle with a color in less instructions than writing each individual pixel. - horizontal and vertical lines are technically filled rectangles. =)
Other than that though, it's still pixel by pixel. What really gets me though, is having to examine each point in the draw destination.
I've limited the search by getting a bounding rectangle for the polygon, but all it does is sort the points so it won't deal with "inside out" polygons. I don't rightly care, because that's almost never what you want anyway, and if you did you could just fill the screen before drawing it or something. I can add support for it fairly easily but it seems a waste of time.
I'm not worried about scanning the path segments in terms of time or space as I expect paths to be very small in practice. Like less than 30 or so points. You can do more of course, but it's on you because I make you pass in a buffer to use anyway.
What I'm concerned about is the brute force check of each pixel in the draw destination to see if it falls within the polygon. That seems ... inelegant to say the least.
I got it working less than 10 minutes after you pointed me to it. =)
Real programmers use butterflies
|
|
|
|
|
honey the codewitch wrote: I got it working less than 10 minutes after you pointed me to it. =) Congratulations. Now you see why I said the geometry was exceedingly simple.
Geometry has become my new hobby over the last few years. I want you to know something personal. I've been a member here on codeproject for over 18 years. I never make any wild physics/math claims (except one a few months ago). Over a year ago I predicted that the core of gas giants are diffuse and contain multiple closed-packed spheres[^]. I posted a brief mention about it over on Ycombinator[^].
Last month they found that indeed the core of Saturn spans 60% of it's diameter[^]. I am just playing around with n-spheres (14-248) dimensional geometries. That news gives me some confidence that at least some of what I am modeling might be correct.
I wish that I could get more people interested in geometry, I am seeing some interesting things.
Best Wishes,
-David Delaune
|
|
|
|
|
Randor wrote: I wish that I could get more people interested in geometry, I am seeing some interesting things
When I went over the high wall back in early 2017 I saw some things - the kinds of things you only see if you're crazy, because apparently I am.
Well, the most profound thing I ever saw - in my life - heck, if I live 6 lifetimes I will never see anything so beautiful - is the organic yet fractalish nature of reality itself, in motion.
It was infinite - folding back in on itself impossibly - the entire thing like a giant clockwork rose blooming, but exceptionally more beautiful.
So yeah, I can appreciate some geometry.
Real programmers use butterflies
|
|
|
|
|
Well,
Anyway, now I am looking forward to your next Lounge post explaining how you were mistaken and that your most challenging algorithm was actually easy as pi.
Best Wishes,
-David Delaune
|
|
|
|
|
I'll edit my original, crediting you with my epiphany. Thank you again.
Real programmers use butterflies
|
|
|
|
|
I was slow to reply because I guess algorithm implies a fairly contained piece of code. So I'd say it was an event dispatcher for telecom state machines.
It wasn't so much the algorithm, but the design around it. When you add lots of supplementary services to a basic call, building One Big State Machine creates a Big Ball of Mud. To keep the state machines separate, they run in an event-routing framework that allows state transitions to be announced, overridden, and/or supplemented. Chain of Responsibility plays a role in instantiating the state machines.
The algorithm for this was implemented in the state machine base class. I've thought about writing an article about it, but I doubt it would have much value because I haven't heard of another domain that requires this kind of solution.
|
|
|
|
|
I could see it in a message passer system like that used in microkernel operating systems.
Real programmers use butterflies
|
|
|
|
|
Although today it would be quite trivial to do, I reckon that a graphical game of Reversi on a RadioShack TRS80 with only 4K of RAM was my most challenging ever. The computer was pretty much unbeatable on the 'hard' setting.
So old that I did my first coding in octal via switches on a DEC PDP 8
|
|
|
|
|
+1 for bringing a game into this instead of code.
Real programmers use butterflies
|
|
|
|
|
Ah, goes back a bit. In 1980 I had to use an HP41CV to invert matrices so I could determine 3D coordinates of four sided plane shapes, all linked to one another (it was a building roof like a tent).
I still remember the buzz from cracking it.
|
|
|
|
|
Not exactly an algorithm but certainly the most challenging I had to do was read data from a LIDAR, at almost 100MB/s (that is mega byte per second), while doing 3D object detection using a third generation embedded core i5 (can not remember if it was a 13W or 17W CPU) with only 1GB of RAM and without dropping any packets/frames/information.
The LIDAR required a dedicated gigabit Ethernet connection to the motherboard. Even a switch in the connection would mean packets were dropped. And that CPU struggled to keep up with the data rate let alone do 3D object detection.
I'm so glad that implementing path finding and object collision on top of that was not my job
Best regards
|
|
|
|
|
Can't narrow it down to one. But when I encounter them, it has the following 2 characteristics:
1) I can't remember writing it (but there's unfortunately evidence that I did)
2) It can't be discerned how it works, or ever worked.
|
|
|
|
|
There's no *laughing so I don't cry* emoji for this relatable content so I improvised as best I could.
Real programmers use butterflies
|
|
|
|
|
Deciphering the HL7 (Healthcare) documentation.
|
|
|
|
|
find a way to compress 1 inch letters and symbols to fit on a small 2 inch tall screen with only 16K flash memory to work with
|
|
|
|
|
We are seeing it a lot in QA at the moment:
"I've written this in C++, but I remembered I need it in C and I'm running out of time - convert it for me?"
"I wrote this in Python, but I need it in C++ and I don't know Python - convert it for me?"
Normally with more spelling mistakes and much worse grammar.
What planet do you have to live on to run that through your head and think "Yeah, every one'll believe that"?
The assumption seems to be that anyone who answers question must be dumber than them - because nobody with a room-temperature IQ or higher would fall for it ...
The fun bit is that it probably doesn't do exactly what their homework wants anyway, and there is zero chance they will understand it enough to fix that, even if they do test it beyond getting a clean compile.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
You're not the only one who's noticed that.
It baffles me that they're not going to do the work to write the code, but instead look up something that looks like it'll work then beg someone to convert it for them. It's a really demonstration of "do the least amount of work possible for a grade".
"F off!" If they're going to turn in an assignment, they're going to do some damn work to get that grade. They have to either write the app themselves or convert the code themselves, but in either case, they're going to be forced to do the damn work.
|
|
|
|
|
Another thing could be to give them something that do similar enough but is written in a way, that there should be no way he could have done it at that point of the lessons, so that the teacher starts asking
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
Rating helpful answers is nice, but saying thanks can be even nicer.
|
|
|
|
|
Middle management material - delegate without having any idea what's going on.
Real programmers use butterflies
|
|
|
|
|
You nailed it with the term lazy...either too lazy to do their own work or too lazy to actually try to understand how to go about it. Unfortunately, there are those who will work for reputation points and provide them with solutions instead of sarcasm...actually, you earn points for sarcasm as well right?
It's nothing new though. Half of the CIS students I graduated with couldn't write a program without help. I was a tutor for a while and remember helping many of them with their homework. It was often spoon feeding them the code line by line...giving them hints first trying to get them to think on their own, then getting aggravated when they didn't seem to be trying.
"Go forth into the source" - Neal Morse
"Hope is contagious"
|
|
|
|
|
kmoorevs wrote: Unfortunately, there are those who will work for reputation points and provide them with solutions instead of sarcasm...actually, you earn points for sarcasm as well right?
Well-crafted sarcasm might earn you additional rep-points from up-votes.
Freedom is the freedom to say that two plus two make four. If that is granted, all else follows.
-- 6079 Smith W.
|
|
|
|
|
Daniel Pfeffer wrote: Well-crafted sarcasm might earn you additional rep-points from up-votes. Shhh... don't tell it too loud...
We will now be flooded not only with poor questions but with poor attempts of sarcasm in the answers too
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
Rating helpful answers is nice, but saying thanks can be even nicer.
|
|
|
|