2018年05月07日
《その376》画像の拡大・縮小(2)
画像の拡大・縮小(2)
今回は、前回《375》のときに触れなかった「拡大・縮小のスピード」についてです。
スピードに関係する部分は2箇所ですが、今回のプログラム(下記)では、
【1】 struct C
if (f) value -= 6;
else value += 1;
if (value > 300) f = 1;
if (value < 6) f = 0;
【2】 MainPage::StartTimer()
TimeSpan span;
span.Duration = 0;
timer->Interval = span;
となっています。
前回のプログラムでは、
【1】 struct C
if (f) value -= 1;
else value += 1;
if (value > 300) f = 1;
if (value < 1) f = 0;
【2】 MainPage::StartTimer()
記述を省略してデフォルト設定のまま
となっていました。
【1】について
前回と今回では、画像を縮小するペースが異なっています(今回は 6、前回は 1)。
したがって、縮小スピードは今回のほうが早くなっています。拡大スピードは同じです。
ただし、縮小スピードを大きくする場合には、value の値が負にならないように注意が必要です。
if (f) value -= 6;
else value += 1;
if (value > 300) f = 1;
if (value < 1) f = 0;
は、エラーになります。
301 から 6 ずつ減少していくと
301, 295, ・・・ , 7, 1, -5
となりますから、
if (value < 1) f = 0;
の value が -5 になったときにエラーが発生します。
ですから、ここは、
if (value < 2) f = 0;
でもエラーになることはありませんが、いちいち考えるのは大変なので
if (value < 6) f = 0;
としました。
また、value は double型なので、0.4 などの 1未満の正数にしてスピードを落とすことも可能です。
【2】について
下記プログラムの、
TimeSpan span;
span.Duration = 0;
timer->Interval = span;
は、デフォルト設定と同じです。
Duration の値を変えることで Interval を変更できます。
Duration の単位は 100ナノ秒なので、
span.Duration = 10000000L;
で、1秒間隔になります。
<参考>
1ミリ秒 = 0.001秒
1マイクロ秒 = 0.000 001秒
1ナノ秒 = 0.000 000 001秒
100ナノ秒 = 0.000 000 1秒
MainPage.xaml.cpp です。
//
// MainPage.xaml.cpp
// MainPage クラスの実装。
//
#include "pch.h"
#include "MainPage.xaml.h"
using namespace App1;
using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;
MainPage::MainPage()
{
InitializeComponent();
}
struct C {
C() : value(0.0), f(0) { }
double operator()() {
if (f) value -= 6;
else value += 1;
if (value > 300) f = 1;
if (value < 6) f = 0;
return value;
}
private:
double value;
int f;
};
C c;
void MainPage::StartTimer() {
auto timer = ref new Windows::UI::Xaml::DispatcherTimer();
TimeSpan span;
span.Duration = 0;
timer->Interval = span;
timer->Start();
auto rcpt
= timer->Tick +=
ref new EventHandler<Object^>(this, &MainPage::OnTick);
}
void MainPage::OnTick(Object^ sender, Object^ e) {
img->Width = c();
}
void App1::MainPage::Page_Loaded(Platform::Object^ sender,
Windows::UI::Xaml::RoutedEventArgs^ e)
{
StartTimer();
}
void App1::MainPage::Button_Click(Platform::Object^ sender,
Windows::UI::Xaml::RoutedEventArgs^ e)
{
exit(0);
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7629235
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック