Deprecated: Creation of dynamic property AIO_WP_Security_Simba_Two_Factor_Authentication_Plugin::$version is deprecated in /home/nickhardeman/nickhardeman.com/blog/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-two-factor-login.php on line 32

Deprecated: Creation of dynamic property wpdbBackup::$backup_dir is deprecated in /home/nickhardeman/nickhardeman.com/blog/wp-content/plugins/wp-db-backup/wp-db-backup.php on line 128

Deprecated: Return type of Requests_Cookie_Jar::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/nickhardeman/nickhardeman.com/blog/wp-includes/Requests/Cookie/Jar.php on line 63

Deprecated: Return type of Requests_Cookie_Jar::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/nickhardeman/nickhardeman.com/blog/wp-includes/Requests/Cookie/Jar.php on line 73

Deprecated: Return type of Requests_Cookie_Jar::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/nickhardeman/nickhardeman.com/blog/wp-includes/Requests/Cookie/Jar.php on line 89

Deprecated: Return type of Requests_Cookie_Jar::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/nickhardeman/nickhardeman.com/blog/wp-includes/Requests/Cookie/Jar.php on line 102

Deprecated: Return type of Requests_Cookie_Jar::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/nickhardeman/nickhardeman.com/blog/wp-includes/Requests/Cookie/Jar.php on line 111

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/nickhardeman/nickhardeman.com/blog/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 40

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/nickhardeman/nickhardeman.com/blog/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 51

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/nickhardeman/nickhardeman.com/blog/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 68

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/nickhardeman/nickhardeman.com/blog/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 82

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/nickhardeman/nickhardeman.com/blog/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 91
Blog | Nick Hardeman | Page 3
Page: 3
Please Log In or Register

Pen Plotter Portrait “Bruce” – Breakdown

 

Bruce

 

 

Beard Close Up

Plotting on the HP7475

Beard Generator

Below is a screen capture of the beard generator application I created in openFrameworks.  Parameters could be adjust to control the appearance of the beard, such as max length, max curliness, gravity, etc.

Generative Beard Growth

I drew some guide lines in Illustrator so I would know the general shape of the beard. Imported the lines into OF and made a grid of hairs and watched them wander, curl and grow.

Beard Outline

One issue with the pen plotter is the lack of clipping. Which can be seen in the above gif. The lines eventually just form a dark mass of curlies. The plotter receives commands that construct lines and outlines, so I had to write some clipping code so that each hair would look more like a tendril. The output after clipping below.

bruceBeardWithClipping

Braid Generator

Now onto the braids. Instead of creating the braids entirely programmatically, I wanted finer control of their appearance. So I created three “braid pieces” in Illustrator. They are in green, pink and yellow. I designed them to be repeatable, nestling in nicely with their neighbors.

 

Braid Pieces

Each piece has four points of reference, as shown by the orange circles. They helped me determine the width and height of the braid and the offset of the lines to the center axis. I used the local x distance from the center axis to rotate the line points around a curve using the normal along the curve.

braid1braid2braid3

This position rotation is applied to every point in every line of each piece. The results of using many braid pieces along curved paths are depicted below.

 

Braid Generator


HP7475 Pen Plotter with OpenFrameworks

HP7475 Pen Plotter Printing from OpenFrameworks
I recently purchased a HP7475 Pen Plotter from ebay for about $110 with shipping. I love that this printer uses physical pens that are dragged on paper to make marks. The marks have the inconsistencies that arise when drawing with a pen on paper and they are beautiful.
The first step was talking with the printer from my MacBook. This printer was initially released in 1983. Several people have detailed steps about sending printer commands from a modern computer.
http://notes.variogr.am/post/29262500593/1980s-pen-plotters-of-the-future
http://grandahl.net/feed/?p=19
http://www.tobiastoft.com/posts/an-intro-to-pen-plotters
Chiplotle!

The printer uses a language called HPGL that is rather straight forward. The above links provide several different ways to communicate with the printer. I want to use OpenFrameworks to communicate with the printer and the above methods seem overly complicated to achieve this. Add-on time!
The original manual is online and there is a cheat sheet for some of the printer commands.
I wrote ofxHPGL to communicate with the printer and it’s rather straightforward. The serial buffer on the printer is super tiny, so there is a sleep millis in there so that the buffer doesn’t overflow. If the printer starts acting weird, that is usually the issue.


Reduce PDF File Size on OSX

I have been scanning and receiving a bunch of PDF files recently and noticed that the file sizes were bigger than they ought to be. One option was to open a PDF in Preview and then Export with a Quartz filter applied, but it didn’t have the quality compression I was seeking.
So I wrote this simple PDF file reducer as a service. Right click on the selected PDF(s) and choose the compression type. I generally go with the 150dpi standard. I noticed about a 80% reduction in color PDFs.
To re-create this OSX service. Open Automator in your Applications folder.
Select New Service.
At the top field, select Service receives selected PDF files in Finder.app.
Add a Duplicate Finder Items by dragging it from the menu on the left and dropping it in the main window.
Add an Add Text item with whatever you want to append to the file names to indicate that these will be lower resolution copies. I used _low and selected after name from the drop down.
Add an Apply Quartz Filter to PDF Documents item. In that item, click options and then select Show this action when the workflow runs if you want to be able to select the quality when you run the service.
Save the service, calling it whatever you like, I called it ReducePDF.
Try selecting a PDF in the finder and right clicking on it. You should see ReducePDF in the contextual menu.

Your service should look something like this in Automator.
Screen Shot 2016-02-08 at 2.59.34 PM


Coconut Still Life – Acrylic + Marker

IMG_5942


Coconut Still Life – Pen

IMG_5934


Older Posts
Newer Posts