ソフトウェア開発したい日記

「面白い!」と思った頭の体操や、数学の問題を載せていきます
その他ロードバイクででかけた先の写真や、ソフト開発のメモ等

カム機構

2009年12月28日 22時16分46秒 | ソフト開発日記
色々やってたけど記録つけるの忘れてた・・。
脈絡ないけど今やろうとしてることだけ書きます。

機構シミュレータに是非とも実装したいカム機構
楕円や卵型、或いは自分で描いた図形をカムとし、回転させて往復運動に変える機構

複雑な形状を回転させるためにまずはGraphics2Dについて勉強

Graphics2D g2 = (Graphics2D)g;
final AffineTransform at = new AffineTransform();
at.rotate(theta, X, Y);
g2.setTransform(at);

まずGraphics型のgをGraphics2D型に変換して準備
アフィン変換用の変数atを宣言

後はrotate(double theta, double x, double y)メソッドで、
(x,y)を中心にthetaだけ回転させる変換を書いてsetして準備完了

これ以降に描く図形は(x,y)を中心にthetaだけ回転された状態で描画される。
thetaを少しずつずらしながら繰り返せば回転アニメ―そん

これだけではカム機構ではないので、次いで当たり判定について・・。
回転中心と回転図形との距離を算出するにはどうすればいいか。
楕円の回転程度なら方程式から出せるかもしれないが、複雑な図形ではまず無理

ここは複雑な形状の当たり判定法としては有名(ちょっと古い?)かもしれないけど
やっぱり色で調べることに。
回転後の図形を描画した後、一直線上の各Pixelの色を取得して
色の変化で図形の境界を調べようと

けど使うメソッドがわからない。
getColor、getRGB、getPixelとかありそうだけど、
イメージデータの色取得だったり携帯電話用のメソッドだったりでうまく使えない・・。

ということで試行錯誤

Java3Dが使いたい

2009年12月19日 23時28分40秒 | ソフト開発日記
まだ2Dもろくに扱えてないけど3Dも使ってみたいのでゼロから勉強

以下本やネットから得た完全な自分メモ

Jav3D API 標準APIではない
主にjavax.media.j3dパッケージに含まれるクラスを使用

線を引く,矩形を塗りつぶすなどだけではなく
視点、物体、光源などあらゆるパラメータがある

モデル作成のモデリングと、モデルを表示するレンタリング
レンタリングによって作られたイメージを描画するには
javax.media.j3d.Canvas3Dクラス
(AWTのjava.awt.Canvasを継承)


3Dグラフィクスの描画の基本部品「プリミティブ」
プリミティブクラス「Primitive」は「com.sun.utils.geometry」パッケージに含まれる
3Dオブジェクトの幾何学形状は総称して総称して「ジオメトリ」と言われる。

PrimitiveクラスにはSphere(球体),Cylinder(円柱),Cone(円錐),Box(直方体)クラスなどがある
オブジェクト生成時にコンストラクタで図形のパラメータを渡す

光源方向を設定するメソッドは
DirectionLight(Color3f color, Vector3f direction)

Vector3f(float x, float y, float z)はベクトル(x, y, z)を定義
Color3f(float r, float g, float b)はRGB値で0~1の範囲の実数値

ワイヤーカット放電加工機シミュレーション

2009年12月09日 09時45分00秒 | ソフト開発日記
風邪でここ数日瀕死

地味に作ってたソフトが大体完成しました。
ワイヤーカット放電加工機の簡易シミュレータ的なものです。

NC言語で書かれたファイルを読み込んで描画してくれるものです。
今やほとんどCAMが使われてると思いますが、原理理解の目的や
学校などで手書きする人向けに。

画像で描いているものはトロコイド曲線、C言語にてプロット点を並べました。
全ての行にG01とありますが無くても同じように動きます。
というか毎回G01と書かないのが普通ですよね。

今回地味に1番苦労したのが、現在描画している行と右側のリストボックスを対応させる点。
JPanelクラスの

setSelectedIndex(int index);

メソッドで表示させたいindex(行)を指定すれば
対応が楽なのでこのメソッドを使いたい。
一方で

setSelectedValue(object anObject, boolean shouldScroll);

メソッドを用いれば、shouldScroll = trueとするだけで
現在選択されてる箇所が見えるまで自動スクロールしてくれるらしい。
ただ選択する行を値で指定しなければいけず、同じ要素の行がある可能性があるNC言語では現実的ではなさそう。

どのようにしてsetSelectedValueで選択した箇所までスクロールさせるか、
ScrollPaneとか調べたり使おうとしたりしたけど無駄でした。
そして何日かまたいだ後、やっとのことでJPanelクラスに

ensureIndexIsVisible(int index);

メソッドを見つけました。
これでindexの位置までスクロールできるようで、試したら普通にいけました。
恐らく「is」「index」「set」「scroll」などで始まるだろうと思って
そこばっかし探してただけでしたと。
もう一つ苦労した、というか解決していないのはファイル読み込み時の
初期ディレクトリ設定について。これはまた体力が回復してから考えます。

Javaの文字列を分割したり操作したり

2009年12月05日 20時52分40秒 | ソフト開発日記
以前C言語で制作したNC言語コンパイラ(NC加工シミュレータ)
にちゃんとしたUIを実装させるべくJavaに移植することに

ファイルから1行ずつ読み込んでString型にするのは
BufferedReaderクラスのreadLine()メソッドでできました

次いで1行を要素ごとに分割するためのメソッドを探すことに

とりあえずStringクラスからは、split()メソッドかsubstring()メソッドが使えそう。
文字列の比較はどうしよう。
C言語のctype.hみたいにisalphaとかisdigit関数的なものはあるのかな。
けどStringクラスのメソッドでisではじまるのはisEmpty()しかなかった。
substringで1文字ずつ読み込んで,正規表現と比較することに。

読み込んだ文字列を変数strに入れ
"\0"が出てくるまで1文字ずつ調べていき

str.substring(i, i+1) == "[a-zA-z]"
str.substring(i, i+1) == "[0-9]"

といった具合に英字なのか数時なのかチェック。
英字+数字をセットで文字列型配列に入れていくように。

するとエラーは出ないけどうまく比較できない。なぜだろう。
調べてたら文字列は==や!=で比較しちゃいけないらしい。
NetBeansにも黄色線で警告してくれてました。

でもうまくいかない。ヌル文字(\0)もないみたい。よくわからない。

GUIの作り直し

2009年12月04日 22時58分03秒 | ソフト開発日記
大学の課題やらバイトやらで昨日は何も出来ず今日もほとんど何も進展なし。

とりあえずクラス設計全て見直しということで
今まで作ってたGUIも1から作り直すことに。
ちゃんとルーチンを細分化して、柔軟なプログラムにしていきたい

GUIの見た目はさほど変えず、必要があれば改良していく方針でいくので
今まで作った冗長なプログラムで作ったGUIを画像で保存しておきます。
これ見ながら作っていきます。今日は疲れたので明日か明後日から・・。