Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Re^4: Creating a circle in a data structure

by AK108 (Friar)
on May 29, 2007 at 04:32 UTC ( [id://617916]=note: print w/replies, xml ) Need Help??


in reply to Re^3: Creating a circle in a data structure
in thread Creating a circle in a data structure

This is exactly what I was looking for. I was able to modify $circle{ $y }{ $x }++; to read $circle{ $y }{ $x } += int sqrt(($x - $center_x) ** 2 + ($y - $center_y) ** 2);. That color-codes the center going out (and would go to the edge of the circle, if I had enough CSS classes).

My use of %curpass earlier was to ensure that any pixel in the original circle didn't get ++'d twice for the same circle entry.

Replies are listed 'Best First'.
Re^5: Creating a circle in a data structure
by BrowserUk (Patriarch) on May 29, 2007 at 22:00 UTC
    That color-codes the center going out (and would go to the edge of the circle, if I had enough CSS classes).

    You could use the code from A hierarchy of color (intensity)? to generate your CSS classes to form a Color ramp. Below I've used 256 which seems to strike the best balance between smoothness and rendering speed.

    I also added cellspacing=0 to the table definition as it much improves the appearance.

    sub colorRamp { my( $v, $vmin, $vmax ) = @_; my( $r, $g, $b ) = (1) x 3; $v = $vmax if $v > $vmax; $v = $vmin if $v < $vmin; ## Uncomment below to invert the color range $v = $vmax + $vmin - $v; my $dv = $vmax - $vmin; if( $v < ( $vmin + 0.25*$dv ) ) { $r = 0; $g = 4 * ($v - $vmin) / $dv; } elsif( $v < ( $vmin + 0.5 * $dv ) ) { $r = 0; $b = 1 + 4 * ($vmin + 0.25 * $dv - $v) / $dv; } elsif( $v < ( $vmin + 0.75 * $dv ) ) { $r = 4 * ($v - $vmin - 0.5 * $dv) / $dv; $b = 0; } else { $g = 1 + 4 * ($vmin + 0.75 * $dv - $v) / $dv; $b = 0; } return sprintf "#%02x%02x%02x", $r*255, $g*255, $b*255; } my $ColorRange = 255; my $styles = ''; $styles .= sprintf ".c%d { background:%s;}\n", $_, colorRamp( $_, 0, $ColorRange ) for 0 .. $ColorRange; my $output = qq~<html> <head> <title>A circle as a table</title> <style type="text/css"> body {background: #888;} $styles </style> </head> <body> <table cellspacing=0 > ~; foreach my $rowid (0 .. max(keys %circle)) { my $row = $circle{$rowid}; $output .= "<tr>"; foreach my $columnid (0 .. max(keys %{$row})) { my $column = $row->{$columnid}; my $class = ''; $column = $ColorRange if $column > $ColorRange; $class = qq~ class="c$column"~ if $column; $output .= qq~<td$class></td>~; } $output .= "</tr>\n"; }

    Is your purpose to generate the structure and the table graphic is just a way of demonstrating it? Or is the display of the result the real objective?

    If the latter, it would probably be much faster and use less bandwidth to render to a .png using GD(or similar) and then link the image.


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Very cool, and this is exactly what I was originally envisioning.

      However, the table is just a way of displaying it graphically for a test. This will be stored in the database for things like elevation (which will not remain perfect circles -- or I would've stored them as such). Eventually, for displaying, I may have a contour map generated from different values here. For the format, I will either generate to PNG or maybe SVG and then to PNG.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://617916]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others taking refuge in the Monastery: (6)
As of 2024-03-29 13:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found