#include<stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 
#include <GL/glut.h> 
 
/* Some <math.h> files do not define M_PI... */ 
#ifndef M_PI 
#define M_PI 3.14159265 
#endif 
 
#define TWO_PI 	(2*M_PI) 
 
typedef struct lightRec {   float amb[4];   float diff[4];   float spec[4];   float pos[4];   float spotDir[3];   float spotExp;   float spotCutoff;   float atten[3]; 
 
  float trans[3];   float rot[3];   float swing[3];   float arc[3];   float arcIncr[3]; 
} Light; 
 
static int useSAME_AMB_SPEC = 1; /* *INDENT-OFF* */ 
static float modelAmb[4] = {0.2, 0.2, 0.2, 1.0}; 
 
static float matAmb[4] = {0.2, 0.2, 0.2, 1.0}; static float matDiff[4] = {0.8, 0.8, 0.8, 1.0}; static float matSpec[4] = {0.4, 0.4, 0.4, 1.0}; static float matEmission[4] = {0.0, 0.0, 0.0, 1.0}; 
/* *INDENT-ON* */ 
 
#define NUM_LIGHTS 3 
static Light spots[] = 
{ 
{ 
    {0.2, 0.0, 0.0, 1.0},  /* ambient */     {0.8, 0.0, 0.0, 1.0},  /* diffuse */ 
    {0.4, 0.0, 0.0, 1.0},  /* specular */ 
    {0.0, 0.0, 0.0, 1.0},  /* position */ 
    {0.0, -1.0, 0.0},   /* direction */ 
    {20.0},
    {60.0},             /* exponent, cutoff */ 
    {1.0, 0.0, 0.0},    /* attenuation */ 
    {0.0, 1.25, 0.0},   /* translation */ 
    {0.0, 0.0, 0.0},    /* rotation */ 
    {20.0, 0.0, 40.0},  /* swing */ 
    {0.0, 0.0, 0.0},    /* arc */ 
    {TWO_PI / 70.0, 0.0, TWO_PI / 140.0}  /* arc increment */ 
  }, 
  { 
    {0.0, 0.2, 0.0, 1.0},  /* ambient */     {0.0, 0.8, 0.0, 1.0},  /* diffuse */ 
{0.0, 0.4, 0.0, 1.0},  /* specular */ 
    {0.0, 0.0, 0.0, 1.0},  /* position */ 
    {0.0, -1.0, 0.0},   /* direction */ 
    {20.0},
    {60.0},             /* exponent, cutoff */ 
    {1.0, 0.0, 0.0},    /* attenuation */ 
    {0.0, 1.25, 0.0},   /* translation */ 
    {0.0, 0.0, 0.0},    /* rotation */ 
    {20.0, 0.0, 40.0},  /* swing */ 
    {0.0, 0.0, 0.0},    /* arc */ 
    {TWO_PI / 120.0, 0.0, TWO_PI / 60.0}  /* arc increment */ 
  }, 
  { 
    {0.0, 0.0, 0.2, 1.0},  /* ambient */     {0.0, 0.0, 0.8, 1.0},  /* diffuse */ 
    {0.0, 0.0, 0.4, 1.0},  /* specular */ 
    {0.0, 0.0, 0.0, 1.0},  /* position */ 
{0.0, -1.0, 0.0},   /* direction */ 
    {20.0}, 
    {60.0},             /* exponent, cutoff */ 
    {1.0, 0.0, 0.0},    /* attenuation */ 
    {0.0, 1.25, 0.0},   /* translation */ 
    {0.0, 0.0, 0.0},    /* rotation */ 
    {20.0, 0.0, 40.0},  /* swing */ 
    {0.0, 0.0, 0.0},    /* arc */ 
    {TWO_PI / 50.0, 0.0, TWO_PI / 100.0}  /* arc increment */ 
  } 
}; 
 
static void 
usage(char *name) 
{ 
  printf("\n"); 
  printf("usage: %s [options]\n", name); 
  printf("\n");   printf("  Options:\n"); 
  printf("    -geometry Specify size and position WxH+X+Y\n"); 
  printf("    -lm       Toggle lighting(SPECULAR and AMBIENT are/not same\n");   printf("\n"); 
#ifndef EXIT_FAILURE /* should be defined by ANSI C <stdlib.h> */ 
#define EXIT_FAILURE 1 
#endif 
  exit(EXIT_FAILURE); 
} 
 
static void initLights(void) 
{   int k; 
 
  for (k = 0; k < NUM_LIGHTS; ++k) { 
    int lt = GL_LIGHT0 + k;     Light *light = &spots[k]; 
    glEnable(lt); 
glLightfv(lt, GL_AMBIENT, light->amb); 
    glLightfv(lt, GL_DIFFUSE, light->diff); 
 
    if (useSAME_AMB_SPEC)       glLightfv(lt, GL_SPECULAR, light->amb);     else 
      glLightfv(lt, GL_SPECULAR, light->spec); 
 
    glLightf(lt, GL_SPOT_EXPONENT, light->spotExp);     glLightf(lt, GL_SPOT_CUTOFF, light->spotCutoff);     glLightf(lt, GL_CONSTANT_ATTENUATION, light->atten[0]);     glLightf(lt, GL_LINEAR_ATTENUATION, light->atten[1]);     glLightf(lt, GL_QUADRATIC_ATTENUATION, light->atten[2]); 
  } 
} 
 
static void 
aimLights(void) 
{   int k; 
  for (k = 0; k < NUM_LIGHTS; ++k) { 
    Light *light = &spots[k]; 
 
    light->rot[0] = light->swing[0] * sin(light->arc[0]);     light->arc[0] += light->arcIncr[0];     if (light->arc[0] > TWO_PI) 
      light->arc[0] -= TWO_PI; 
 
    light->rot[1] = light->swing[1] * sin(light->arc[1]);     light->arc[1] += light->arcIncr[1];     if (light->arc[1] > TWO_PI) 
      light->arc[1] -= TWO_PI; 
 
    light->rot[2] = light->swing[2] * sin(light->arc[2]);     light->arc[2] += light->arcIncr[2];     if (light->arc[2] > TWO_PI) 
      light->arc[2] -= TWO_PI; 
  } 
} 
static void setLights(void) 
{   int k; 
 
  for (k = 0; k < NUM_LIGHTS; ++k) { 
    int lt = GL_LIGHT0 + k;     Light *light = &spots[k]; 
 
    glPushMatrix(); 
    glTranslatef(light->trans[0], light->trans[1], light->trans[2]);     glRotatef(light->rot[0], 1, 0, 0);     glRotatef(light->rot[1], 0, 1, 0);     glRotatef(light->rot[2], 0, 0, 1);     glLightfv(lt, GL_POSITION, light->pos);     glLightfv(lt, GL_SPOT_DIRECTION, light->spotDir);     glPopMatrix(); 
  } 
} 
 
static void 
drawLights(void) 
{   int k; 
  glDisable(GL_LIGHTING);   for (k = 0; k < NUM_LIGHTS; ++k) { 
    Light *light = &spots[k]; 
 
    glColor4fv(light->diff); 
 
    glPushMatrix(); 
    glTranslatef(light->trans[0], light->trans[1], light->trans[2]);     glRotatef(light->rot[0], 1, 0, 0);     glRotatef(light->rot[1], 0, 1, 0);     glRotatef(light->rot[2], 0, 0, 1); 
    glBegin(GL_LINES); 
    glVertex3f(light->pos[0], light->pos[1], light->pos[2]);     glVertex3f(light->spotDir[0], light->spotDir[1], light->spotDir[2]); 
glEnd(); 
    glPopMatrix(); 
  } 
  glEnable(GL_LIGHTING); 
} 
 
static void drawPlane(int w, int h) 
{   int i, j; 
  float dw = 1.0 / w; 
  float dh = 1.0 / h; 
 
  glNormal3f(0.0, 0.0, 1.0);   for (j = 0; j < h; ++j) { 
    glBegin(GL_TRIANGLE_STRIP); 
    for (i = 0; i <= w; ++i) {       glVertex2f(dw * i, dh * (j + 1)); 
      glVertex2f(dw * i, dh * j); 
    } 
    glEnd(); 
  } 
} 
int spin = 0; 
 
void 
display(void) 
{ 
  glClear(GL_COLOR_BUFFER_BIT); 
 
  glPushMatrix(); 
  glRotatef(spin, 0, 1, 0); 
 
  aimLights(); 
  setLights(); 
 
  glPushMatrix();   glRotatef(-90.0, 1, 0, 0);   glScalef(1.9, 1.9, 1.0);   glTranslatef(-0.5, -0.5, 0.0);   drawPlane(16, 16);   glPopMatrix(); 
 
  drawLights(); 
  glPopMatrix(); 
 
  glutSwapBuffers(); 
} 
 
void animate(void) 
{ 
  spin += 0.5;   if (spin > 360.0)     spin -= 360.0;   glutPostRedisplay(); 
} 
 
void 
visibility(int state) 
{ 
  if (state == GLUT_VISIBLE) { 
    glutIdleFunc(animate); 
  } else {     glutIdleFunc(NULL); 
  } 
} 
 
int 
main(int argc, char **argv) 
{   int i; 
 
  glutInit(&argc, argv); 
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
  /* process commmand line args */ 
  for (i = 1; i < argc; ++i) { 
    if (!strcmp("-lm", argv[i])) { 
      useSAME_AMB_SPEC = !useSAME_AMB_SPEC; 
} else { 
      usage(argv[0]); 
    } 
  } 
 
  glutCreateWindow("GLUT spotlight swing"); 
  glutDisplayFunc(display);   glutVisibilityFunc(visibility); 
 
  glMatrixMode(GL_PROJECTION); 
  glFrustum(-1, 1, -1, 1, 2, 6); 
 
  glMatrixMode(GL_MODELVIEW); 
  glTranslatef(0.0, 0.0, -3.0);   glRotatef(45.0, 1, 0, 0); 
 
  glEnable(GL_LIGHTING); 
  glEnable(GL_NORMALIZE); 
 
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, modelAmb);   glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);   glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); 
 
  glMaterialfv(GL_FRONT, GL_AMBIENT, matAmb);   glMaterialfv(GL_FRONT, GL_DIFFUSE, matDiff);   glMaterialfv(GL_FRONT, GL_SPECULAR, matSpec);   glMaterialfv(GL_FRONT, GL_EMISSION, matEmission); 
  glMaterialf(GL_FRONT, GL_SHININESS, 10.0); 
 
  initLights(); 
 
  glutMainLoop(); 
  return 0;  /* ANSI C requires main to return int. */  

C Language online compiler

Write, Run & Share C Language code online using OneCompiler's C online compiler for free. It's one of the robust, feature-rich online compilers for C language, running the latest C version which is C18. Getting started with the OneCompiler's C editor is really simple and pretty fast. The editor shows sample boilerplate code when you choose language as 'C' and start coding!

Read inputs from stdin

OneCompiler's C online editor supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample C program which takes name as input and print your name with hello.

#include <stdio.h>
int main()
{
    char name[50];
    printf("Enter name:");
    scanf("%s", name);
    printf("Hello %s \n" , name );
    return 0;
    
}

About C

C language is one of the most popular general-purpose programming language developed by Dennis Ritchie at Bell laboratories for UNIX operating system. The initial release of C Language was in the year 1972. Most of the desktop operating systems are written in C Language.

Key features:

  • Structured Programming
  • Popular system programming language
  • UNIX, MySQL and Oracle are completely written in C.
  • Supports variety of platforms
  • Efficient and also handle low-level activities.
  • As fast as assembly language and hence used as system development language.

Syntax help

Loops

1. If-Else:

When ever you want to perform a set of operations based on a condition if-else is used.

if(conditional-expression) {
   // code
} else {
   // code
}

You can also use if-else for nested Ifs and if-else-if ladder when multiple conditions are to be performed on a single variable.

2. Switch:

Switch is an alternative to if-else-if ladder.

switch(conditional-expression) {    
case value1:    
 // code    
 break;  // optional  
case value2:    
 // code    
 break;  // optional  
...    
    
default:     
 // code to be executed when all the above cases are not matched;    
} 

3. For:

For loop is used to iterate a set of statements based on a condition.

for(Initialization; Condition; Increment/decrement){  
  // code  
} 

4. While:

While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.

while(condition) {  
 // code 
}  

5. Do-While:

Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.

do {
  // code 
} while (condition); 

Arrays

Array is a collection of similar data which is stored in continuous memory addresses. Array values can be fetched using index. Index starts from 0 to size-1.

Syntax

One dimentional Array:

data-type array-name[size];

Two dimensional array:

data-type array-name[size][size];

Functions

Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity.

Two types of functions are present in C

  1. Library Functions:

Library functions are the in-built functions which are declared in header files like printf(),scanf(),puts(),gets() etc.,

  1. User defined functions:

User defined functions are the ones which are written by the programmer based on the requirement.

How to declare a Function

return_type function_name(parameters);

How to call a Function

function_name (parameters)

How to define a Function

return_type function_name(parameters) {  
  //code
}