BiorhythmCanvas.drawMarks()メソッドdrawMarks()を見ていきましょう。
前述のdrawCurves()で描いたバイオリズム曲線上にマークを描くメソッドです。簡単のために身体のマークを描く部分を見ていきます。
得られるバイオリズムの値に応じてマークをカーブ上のどこに表示するか決めてやればあとは簡単です。
どこに表示するか決める方法は色々あると思いますが、ここではサインカーブの一周期を12等分した点上に表示することにし、配列
private int[] physicalValue = {9, 10, 11, 11, 0, 0, 0, 1, 1, 1, 2, 3, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8};
を用いて決定しています。例えば得られたバイオリズムの値が0ならば12等分した9番目の点に、1ならば10番目の点に表示するといった具合です。
前述のdrawLines()ではサインカーブを24等分して描いたので、座標の計算にこれを用いると簡単です。
int physicalPoint = physicalValue[yourBiorhythm.getPhysicalBiorhythm()] * 2;
として12等分した何番目に描くかを2倍して、24等分した何番目に描くかをphysicalPointとして得ます。
続いて
if (physicalImage != null) {
//physicalImage が設定されている場合はそれを描く。
} else {
//physicalImage が設定されていない場合は角の丸い四角を描く。
}
と処理を分けています。どちらのケースも似たような処理をしているので、physicalImageが設定されている場合だけを説明します。
g.drawImage(physicalImage,
gridWidth * physicalPoint + PHYSICAL_ORIGIN_X - physicalImageDimension.width / 2,
(int)(amplitude * Math.sin((double)(physicalPoint - 18) * Math.PI / 12.0)) + ORIGIN_Y - physicalImageDimension.height / 2,
this);
でphysicalImageを描くだけです。x座標の指定ですが、まず
gridWidth * physicalPoint + PHYSICAL_ORIGIN_X
までは前述のdrawCurves()での計算と同じです。イメージの中心がカーブ上の等分した点にくるようにしたいので、ここから
physicalImageDimension.height / 2
を引いています。physicalImageDimensionはイメージの大きさが入るDimension型の変数で、イメージを設定するときに計算されます。y座標の計算も同様です。
以上physicalImageが設定されている場合の身体のマークを描く部分を説明しましたが、他の部分も同様です。