- PR -

位置からミリ秒、ミリ秒から位置の求め方を教えてください。

1
投稿者投稿内容
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-09-08 17:15
曲を再生し、その曲が始まると四角いイメージがパネルの左端から右端まで動かしたいのです。
どの曲を再生しても曲の終わりにピッタリとパネルの右端にイメージが到着するようにしたいのです。
例えば、2秒の曲なら2秒後にイメージが右端に到着し、一時間の曲なら一時間後にイメージが右端に到着する。
それに伴ってイメージの位置からミリ秒を算出する関数とミリ秒からイメージの位置を算出する関数の二つの関数を作りたいのです。
イメージの位置からミリ秒を算出するのは多分下記で良いと思うのですが、
ミリ秒からイメージの位置を算出する数式がわかりません。

下記はわかっていてグローバルで定義している変数です。
・intSongLength = 再生している曲の長さ(ミリ秒)、再生する曲が変わる度に長さは変わります。
・intPanelWidth = 絵の動く距離、固定です。

//位置からその時間を算出する
public int getTimeFromPos(int X){
 return X * (intSongLength / intPanelWidth);
}

//時間から位置を算出する
public int getPosFromTime(int time) {

}
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-09-08 17:24
引用:

Casperさんの書き込み (2003-09-08 17:15) より:
曲を再生し、その曲が始まると四角いイメージがパネルの左端から右端まで動かしたいのです。
どの曲を再生しても曲の終わりにピッタリとパネルの右端にイメージが到着するようにしたいのです。
例えば、2秒の曲なら2秒後にイメージが右端に到着し、一時間の曲なら一時間後にイメージが右端に到着する。
それに伴ってイメージの位置からミリ秒を算出する関数とミリ秒からイメージの位置を算出する関数の二つの関数を作りたいのです。
イメージの位置からミリ秒を算出するのは多分下記で良いと思うのですが、
ミリ秒からイメージの位置を算出する数式がわかりません。

下記はわかっていてグローバルで定義している変数です。
・intSongLength = 再生している曲の長さ(ミリ秒)、再生する曲が変わる度に長さは変わります。
・intPanelWidth = 絵の動く距離、固定です。

//位置からその時間を算出する
public int getTimeFromPos(int X){
 return X * (intSongLength / intPanelWidth);
}

//時間から位置を算出する
public int getPosFromTime(int time) {

}


私はこの処理について何も知りませんがgetTimeFromPostがただしいなら
return time * (intPanelWidth / intSongLength);
かな
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-09-08 17:41
お答えありがとうございました。

Jun様の式だと必ず0になってしまいませんか?
例えば
time = 1000ミリ秒
intPanelWidth = 100
intSongLength = 50000ミリ秒
1000 * (100 / 50000) = 0.2

戻り値がintですので戻りは0です。

いかがでしょうか?
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-09-08 18:02
引用:

Casperさんの書き込み (2003-09-08 17:41) より:
お答えありがとうございました。

Jun様の式だと必ず0になってしまいませんか?
例えば
time = 1000ミリ秒
intPanelWidth = 100
intSongLength = 50000ミリ秒
1000 * (100 / 50000) = 0.2

戻り値がintですので戻りは0です。

いかがでしょうか?

Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-09-08 18:05
引用:

Casperさんの書き込み (2003-09-08 17:41) より:
お答えありがとうございました。

Jun様の式だと必ず0になってしまいませんか?
例えば
time = 1000ミリ秒
intPanelWidth = 100
intSongLength = 50000ミリ秒
1000 * (100 / 50000) = 0.2

戻り値がintですので戻りは0です。

いかがでしょうか?


それは距離の単位が変わればどうにでもなることのような気がします
0にしたくないなら
計算時に分子に分母-1を足せばよいし
四捨五入したければ分母/2を足せばよいことでは
それは別のほうの式でも同じと思います
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-09-08 18:41
return (int)(time * ((double)intPanelWidth / (double)intSongLength));

return (time * intPanelWidth) / intSongLength;
でよいと思います。

Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-09-08 18:44
引用:

Wataさんの書き込み (2003-09-08 18:41) より:
return (int)(time * ((double)intPanelWidth / (double)intSongLength));

return (time * intPanelWidth) / intSongLength;
でよいと思います。





そういえばそうでした.括弧を間違ってましたね
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-09-08 19:20
Wata様、Jun様ありがとうございました。

>return (int)(time * ((double)intPanelWidth / (double)intSongLength));

で問題ありませんでした。
1

スキルアップ/キャリアアップ(JOB@IT)