Friday, March 27, 2015

Spider Eyes

/* 
 * File:   spider2main.c
 * Author: hmikelson
 *
 * Created on March 24, 2015, 4:30 PM
 */

#if defined(__XC)
    #include <xc.h>         /* XC8 General Include File */
#elif defined(HI_TECH_C)
    #include <htc.h>        /* HiTech General Include File */
#endif

#include <stdint.h>        /* For uint8_t definition */
#include <stdbool.h>       /* For true/false definition */
#include <stdlib.h>     /*rand()*/

#pragma config MCLRE=OFF,CP=OFF,WDTE=OFF,FOSC=INTOSCIO
#define _XTAL_FREQ 4000000
uint8_t sGPIO;

void init()
{
    //Configure GPIO Port
    ANSEL =  0b00000000;  //Configure all GPIO pins as digital
    TRISIO = 0b11001000;  //Set GP3 as input and the rest as outputs
    OPTION_REGbits.nGPPU = 0;
    WPU = 0b00000100;     //Enable weak pullups on GP2
    //Configuer AD Convertor
    ADCON0 = 0x00;        //AD disabled
    ADRESH = 0x00;        //Init the AD Register
    //Configure Comparator
    CMCON0 = 0xFF;   // Comparator is turned off
    CMCON1 = 0x00;   // Comparator is turned off
    //Interrupt configuration
    INTCON = 0x00;   //Disable all interrupts
}

void vdelay(int n)
{
    int i;
    for (i=0;i<=n;i++)
    {
     __delay_us(1);
    }
}

void fade_eyes(int n) // PWM sweep high f to low f
{
 int i;
  {
   for (i=0;i<n;i++)
    {
     GPIO = 0b11000101;
     vdelay(i);
     GPIO = 0b11000000;
     vdelay(n-i);
    }
   for (i=0;i<n;i++)
    {
     GPIO = 0b11000101;
     vdelay(n-i);
     GPIO = 0b11000000;
     vdelay(i);
    }
  }
}

void scan_eyes(int n) // PWM sweep high f to low f
{
 int i,j,k;
 int i1,i2,i3,pw1,pw2;
 uint8_t sGPIO;

 i1=1; i2=-1; pw1=0; pw2=n;
 sGPIO = GPIO;
 for (k=0;k<6;k++)
 {
  for (j=0;j<n;j++)
   {
    for (i=0;i<n;i++)
     {
      if (i>pw1)
       {
        sGPIO = sGPIO & 0b11111110;
       }
      else
       {
        sGPIO = sGPIO | 0b00000001;
       }
      if (i>pw2)
       {
        sGPIO = sGPIO & 0b11111011;
       }
      else
       {
        sGPIO = sGPIO | 0b00000100;
       }
      GPIO = sGPIO;
     }
    pw1 = pw1 + i1;
    pw2 = pw2 + i2;
   }
  i3 = i1; i1 = i2, i2 = i3;
 }
}

void dark_eyes(void) // PWM sweep high f to low f
{
 GPIO = 0b11000000;
 __delay_ms(1000);
}

void main()
{
uint8_t r,r2;

 init();

 while(1)
  {
   r=rand()%8;
   r2 = rand()%8+1;
   //r=3;
   switch (r)
    {
     case 1:
     fade_eyes(100*r2);
     break;

     case 2:
     fade_eyes(20*r2);
     break;

     case 3:
     scan_eyes(20*r2);
     break;

     default:
     dark_eyes();
    }
  }
}

Wednesday, March 18, 2015

Spherical Lissajous Curves using POVRay






Some examples of spherical Lissajous curves created with POVRay.

##############################################################################
# This program created by Hans Mikelson February 1998
# This program generates a POV file so that 3D graphs can be
# rendered using the POV ray tracing package.  The surface is mapped
# as a sphere for each data point sampled.  This was configured for
# use on a Win95 computer.  Some changes may need to be made for use on
# other systems.  This program assumes that POVRay has been installed
# and that there is a path to it.
##############################################################################

# Define files for the template (header/footer), the data and the POV file.
$povfile="plotter.pov";
$scale   =.25;
$radius  = $scale;

# open the POV file.
open (POV, ">$povfile");

# Print the header
print POV "#version 3.0\n";
print POV "global_settings { assumed_gamma 2.2 }\n\n";
print POV "#include \"colors.inc\"\n";
print POV "#include \"shapes.inc\"\n";
print POV "#include \"textures.inc\"\n";
print POV "#include \"glass.inc\"\n";
print POV "#include \"stones.inc\"\n\n";
print POV "#include \"metals.inc\"\n\n";
print POV "camera {\n";
print POV "location <-2,-9,-2>\n";
print POV "  look_at <-2,0,-2>}\n\n";
print POV "// Light sources \n";
print POV "light_source {<-30, 21,  40> color White}\n";
print POV "light_source {< 0, -8, -4> color White}\n";
print POV "light_source {< 2,  30,  3> color White}\n";
print POV "background { color rgb <1, 1, 1> }\n\n";

@ul = (.3,.3,.6);
@vl = (.2,.2,.9);

for ($j=0; $j<1; $j++)
 {
  for ($k=0; $k<1; $k++)
   {
$u = $ul[$j];
$v = $vl[$k];
$rad = 2;

# Print the data.
for ($i=0; $i<800; $i++)
 {
  $t = $i * .1;
  # Cosines
  $cosu = cos($u*$t);
  $cosv = cos($v*$t);

  # Sines
  $sinu = sin($u*$t);
  $sinv = sin($v*$t);

  # Compute X and Y
  $xval = $rad*$sinu*$cosv;
  $yval = $rad*$sinu*$sinv;
  $zval = $rad*$cosu;


  $colr=1/(1+$xval*$xval);
  $colg=1/sqrt(1+abs($yval));
  $colb=1/(1+$zval*$zval*$zval*$zval);
  
  $xval += $j*5; $yval += $k*5;

  print POV "sphere { <$xval, $zval, $yval>, $radius\n";
  print POV "    texture { pigment {color rgb <$colr, $colg, $colb>}}\n";
  print POV "    finish {caustics 1.0 phong 1 phong_size 300 reflection 0.15}\n";
  print POV "}\n\n";

  if ($i>0)
   {
    print POV "cylinder { <$xval, $zval, $yval>, <$xold, $zold, $yold> $radius\n";
    print POV "    texture { pigment {color rgb <$colr, $colg, $colb>}}\n";
    print POV "    finish {caustics 1.0 phong 1 phong_size 300 reflection 0.15}\n";
    print POV "}\n\n";
   }
  $xold = $xval;
  $yold = $yval;
  $zold = $zval;
 }

}}
close(POV);

# End of script

Electron Orbitals using POVRay Graphics


This image was created using POVRay and the wave function for electron orbitals.  1s, 2s, 3s on the left, p orbitals on the right, 2p on top and 3p on the bottom.