2015年11月29日日曜日

持っている本紹介(プログラミング言語編)


プログラミング言語C

プログラミング言語C++

プログラミングRuby

プログラミング言語Ruby

プログラミング言語Java

Land Of Lisp

OpenGL:テキスチャーとライト

四角形にテキスチャーをはって、
スポットライトをぐるぐるしてみる。
読み込みファイルは、24ビット ビットマップファイルを読み込み。

今回実行時読み込んだファイル
実行結果



#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>
#define M_PI 3.141592653589793
#include "GL/glut.h"

BITMAPFILEHEADER bmpFH;
BITMAPINFOHEADER bmpIH;
static GLubyte *imageBuf;
static GLuint texName;

//24色 bmpファイルの読み込み
void readFile(PSTR fName){
  HANDLE hFile;
  DWORD readBytes;
  /* ファイルのオープン*/
  hFile = CreateFile(fName , GENERIC_READ , 0 , NULL ,
OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
  /* ヘッダ部分の読み込み */
  ReadFile(hFile,&bmpFH,sizeof(BITMAPFILEHEADER),&readBytes,NULL);

  ReadFile(hFile , &bmpIH , sizeof (BITMAPINFOHEADER) , &readBytes , NULL);

  /*サイズ分のバッファ確保 */
  imageBuf = (GLubyte*)malloc(bmpIH.biSizeImage*sizeof(GLubyte));
  /*ファイル読み込み*/
  ReadFile(hFile , imageBuf,bmpIH.biSizeImage*sizeof(GLubyte),&readBytes,NULL);
  /*ファイルを閉じる*/
  CloseHandle(hFile);

}

void display(void)
{
  GLdouble len = 1000;
  GLdouble len2 = 0.9;
  GLdouble xPos,yPos,xCPos,yCPos;
  int ii,jj;
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glColor3d(1,1,1);

  glBegin(GL_LINES);
  glVertex3d(-len,0,0);
  glVertex3d(len,0,0);
  glVertex3d(0,-len,0);
  glVertex3d(0,len,0);
  glVertex3d(0,0,-len);
  glVertex3d(0,0,len);
  glEnd();

  GLdouble nv[] = {0,0,1};
  glEnable(GL_TEXTURE_2D);
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  glBindTexture(GL_TEXTURE_2D,texName);

  glBegin(GL_QUADS);

  double num = 450;

  for(ii = 0;ii<=num;ii++){
  for(jj = 0;jj<=num;jj++){

   xPos = jj/num;
   yPos = ii/num;

 xCPos = jj/num;
 yCPos = ii/num;

   glNormal3dv(nv);
   glTexCoord2d(xPos,yPos);glVertex3d(xPos,yPos,0);
   glNormal3dv(nv);
   glTexCoord2d(xPos+0.01,yPos);glVertex3d(xPos+0.01,yPos,0);
   glNormal3dv(nv);
   glTexCoord2d(xPos+0.01,yPos+0.01);glVertex3d(xPos+0.01,yPos+0.01,0);
   glNormal3dv(nv);
   glTexCoord2d(xPos,yPos+0.01);glVertex3d(xPos,yPos+0.01,0);
  }
  }

  glDisable(GL_TEXTURE_2D);

  glEnd();
  glFlush();
  glutSwapBuffers();
}
void myReshape(GLsizei w, GLsizei h){
  glViewport(0, 0, w, h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(0, 1, 0, 1, -1, 1);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}


void idleFunc(void){
  static GLdouble x = 0;
  static GLdouble y = 0;
  static GLint theta = 0;
  static GLfloat spot_direction[] = { 0.0, 0.05, -1.0 } ;

  static GLdouble agree;

  theta +=5;

  if(theta >= 360){
theta = 0;
  }
  // スポットライトの方向指定
  agree = M_PI/180*theta;
  x = cos(agree)/4+0.25;
  y = sin(agree)/4+0.25;
  spot_direction[0] = x;
  spot_direction[1] = y;

  glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
  glutPostRedisplay();
  Sleep(1);
  glutIdleFunc(idleFunc);

}

void myinit (char* argv)
{
  GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  GLfloat mat_shininess[] = { 0.0 };
  GLfloat light_position[] = {0.0, 0.0, 1.5, 1.0 };
  GLfloat spot_direction[] = { 0.0, 0.05, -1.0 };
  GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };

  GLfloat lightBlack[] = {0.0,0.0,0.0,0.0};

  // ライトの設定
  glClearColor (0.0, 0.0, 0.0, 0.0);
  glShadeModel (GL_SMOOTH);

  glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

  glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  glLightfv(GL_LIGHT0, GL_AMBIENT,  lightBlack);
  glLightfv(GL_LIGHT0, GL_DIFFUSE,  lightBlack);

  glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
  glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  glLightf (GL_LIGHT0, GL_SPOT_CUTOFF, 5.0);

  glClearColor (0.0, 0.0, 0.0, 0.0);

  readFile(argv);

  //Textureの設定
  glGenTextures(1,&texName);
  glBindTexture(GL_TEXTURE_2D,texName);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
 GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
 GL_NEAREST);

  glTexImage2D(GL_TEXTURE_2D,0,3,bmpIH.biWidth,bmpIH.biHeight,0
  ,GL_BGR_EXT,GL_UNSIGNED_BYTE,imageBuf);

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
}



int main(int argc, char** argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
  glutCreateWindow(argv[0]);
  glutPositionWindow(100,100);
  glutReshapeFunc (myReshape);
  glutDisplayFunc(display);
  myinit (argv[1]);
  glutIdleFunc(idleFunc);
  glutMainLoop();
}

2015年11月26日木曜日

.netで表の描画

.netで表描画。 実行結果はこんな感じ

 

ついでに印刷ボタンも追加
コンパイルは

csc ChartTest.cs /r:System.Windows.Forms.DataVisualization.dll

ソースはこんな感じ

using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

public class ChartTest:Form
{
  private Chart chart;
  private PrintDocument pd;

  public ChartTest()
  {
this.SuspendLayout();

Button btn = new Button();
btn.Text = "印刷";
btn.Location = new Point(10,420);
btn.Click += new EventHandler(OKBtn_Click);
Button btn2 = new Button();

btn2.Text = "チャートタイプ変更";
btn2.Location = new Point(150,420);
btn2.Size = new Size(200,btn2.Size.Height);
btn2.Click += new EventHandler(OKBtn2_Click);

Size = new Size(500,500);
SetChart();
Controls.Add(btn);
Controls.Add(btn2);

this.ResumeLayout();
  }

  //印刷ボタン押下時の処理
  void OKBtn_Click  (Object sender,
EventArgs e){
pd = new PrintDocument();
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
pd.Print();
  }

  //変更ボタン押下時の処理
  void OKBtn2_Click  (Object sender,
EventArgs e){
chart.Series[0].ChartType = SeriesChartType.Bar;
  }

  //印刷ページ設定
  private void pd_PrintPage(object sender, PrintPageEventArgs ev)
  {
Size s = chart.Size;
Bitmap bmp = new Bitmap(s.Width,s.Height);
Graphics g = ev.Graphics;
chart.DrawToBitmap(bmp,new Rectangle(0,0,s.Width,s.Height));
g.DrawImage(bmp,0,0);
  }

  //チャート画面の作成
  private void SetChart()
  {
//チャート画面の作成
chart = new Chart();
chart.ChartAreas.Add(new ChartArea("chart1"));

chart.Size = new Size(400,400);

Controls.Add(chart);

//グラフの画面
Series series;
chart.Series.Add(new Series());
series = chart.Series[0];
series.ChartArea = "chart1";
series.ChartType = SeriesChartType.Line;

//データの作成
int ii;
for(ii = 1; ii < 10 ; ii++)
 {
DataPoint dp = new DataPoint(ii,ii*2);
series.Points.Add(dp);
 }
  }

  public static int Main(string[] args)
  {
ChartTest ct = new ChartTest();
ct.ShowDialog();
return 0;
  }

}


2015年11月25日水曜日

よく使う emacs キーバインドメモ



基本
キーバインド 説明
C-x C-c emacsの終了
C-x C-f ファイルを開く
C-x b バッファを開く
C-g 現在の操作を終了
C-spc マークの設定

カーソル移動
C-p 前の行
C-n 次の行
C-f 次の文字
C-b 前の文字
M-> ファイルの最終行に移動
M-< ファイルの最初の行に移動
C-x C-x マーク位置に戻る
C-v 次のページに移動
M-v 前のページに移動
M-% 文字の置換
C-s 文字列検索(前方向)
C-r 文字列検索(後ろ方向)

編集
C-k 行の削除
C-x Ret c 文字コード入力 C-x C-f 文字コードを指定してファイルを開く
C-x Ret f 文字コード入力 開いているファイルの文字コードを変更する
C-w マーク位置からカーソル位置を削除
M-w マーク位置からカーソル位置をコピー
C-y コピーした文字を貼り付け
C-x rk 矩形領域の削除
C-x rt 矩形領域に指定文字挿入
C-x rr 矩形領域のコピー
C-x rg 矩形領域に貼り付け
C-x C-u 選択範囲を大文字にする
C-x C-l 選択範囲を小文字にする

その他
C-x 52 ウィンドウを開く
C-x 2 ウィンドウを上下に分割する
C-x 3 ウィンドウを縦横に分割する
C-x 1 分割したウィンドウを元に戻す

2015年11月19日木曜日

Windowsプログラム勉強用メモ


Windowsプログラミング
 標準Windows API
  細かくひとつづつ説明してくれている。
  わかりやすい
 猫でもわかる
  有名なサイト、ボリュームが多い

その他参考サイト
 リソーススクリプト定義
    リソーススクリプトの書き方定義。英語だけど

   Bcc32のダウンロードページ
  フリーのコンパイラ

   Window Message
     Window Messageの参考資料(英語)
 



2015年11月15日日曜日

OpenGL:三角形を回転してみる

三角形を表示できたので、次は三角形を回転してみる。
実行結果は、こんな感じ。

#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "GL/glut.h"

GLfloat angle = 0;
void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3d(1,1,1);

  //線を描画
  glBegin(GL_LINES);
    glVertex3d(-1,0,0);
    glVertex3d(1,0,0);
glVertex3d(0,-1,0);
    glVertex3d(0,1,0);
  glEnd();


  //三角形を描画
  //線が回らないようにPushMatrix
  glPushMatrix();
    glRotated(angle,0,1,0);
    glBegin(GL_TRIANGLES);
 glColor3d(1,0,0);
      glVertex3d(-0.5,0,0);
 glColor3d(0,1,0);
      glVertex3d(0.5,0,0);
 glColor3d(0,0,1);
      glVertex3d(0.0,0.5,0);
    glEnd();
  glPopMatrix();

  glFlush();

  glutSwapBuffers();

}

void animate(void){
  if(angle >= 360){
angle = 0;
  }
  else{
angle += 2;
  }

  Sleep(10);
  glutPostRedisplay();
  glutIdleFunc(animate);
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);

    glutCreateWindow("TRIANGLE TEST");

    glutPositionWindow(100,100);
glutIdleFunc(animate);
    glutDisplayFunc(display);
    glutMainLoop();

}
 


2015年11月14日土曜日

OpenGL:最初は三角形

取りあえず、GLUTを使って、三角形を表示するプログラム

void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3d(1,1,1);
  glBegin(GL_TRIANGLES);
    glVertex3d(0,0,0);
    glVertex3d(0.9,0,0);
    glVertex3d(0.9,0.9,0);
  glEnd();

  glFlush();
  glutSwapBuffers();
}


int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);

    glutCreateWindow("TRIANGLE TEST");

    glutPositionWindow(100,100);
    glutDisplayFunc(display);
    glutMainLoop();

}
コンパイルした結果はこんな感じ。

2015年11月10日火曜日

OpenGL:勉強用リンク

OpenGL Redbook
3つの中では、一番丁寧で詳しいと思うけど、
英語&むずかしい

GLUTによる「手抜き」OpenGL入門
大学の先生の分かりやすいけど、ボリューム不足

OpenGL入門
プログラム例が多い

OpenGL 2.1 API

OpenGL 4.5 API

GLUT API Version3

OpenGL TextureFAQ

2015年11月9日月曜日

ソフトウェア勉強用メモ

ソフトウェア関連の
勉強メモを公開していきます。
今勉強しているのは、
・OpenGL
・Windows API
・Androidの開発
など