亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? animate_f.h

?? 彩信瀏覽器
?? H
字號:
/* * This file is part of Ambulant Player, www.ambulantplayer.org. * * Copyright (C) 2003-2007 Stichting CWI,  * Kruislaan 413, 1098 SJ Amsterdam, The Netherlands. * * Ambulant Player is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * Ambulant Player is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Ambulant Player; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA *//*  * @$Id: animate_f.h,v 1.12 2007/02/12 14:14:44 jackjansen Exp $  */#ifndef AMBULANT_SMIL2_ANIMATE_F_H#define AMBULANT_SMIL2_ANIMATE_F_H#include "ambulant/config/config.h"#include "ambulant/common/region_dim.h"#include "ambulant/lib/gtypes.h"#include <cmath>#include <map>#include <vector>#ifndef AMBULANT_PLATFORM_WIN32_WCE_3#include <cassert>#endif#ifdef max#undef max#endif#ifdef min#undef min#endifnamespace ambulant {namespace smil2 {// Base class for simple dur animation functions// Implements time manupulations for the hierarchy//class simple_animation_f {  public:	typedef long time_type;	simple_animation_f() : m_d(0), m_accelerate(0.0), m_decelerate(0.0) {}		time_type dur() const {		return m_d;	}		time_type manipulated(time_type t) const {		return accelerate(auto_reverse(t));	}	void set_auto_reverse(bool b) { m_auto_reverse = b;}	void set_accelerate(double a, double d) { m_accelerate = a; m_decelerate = d;}	  protected:	// a simple_animation_f is defined for the interval [0,d]	time_type m_d;    private:		// t in [0, 2*d]	time_type auto_reverse(time_type t) const {		if(!m_auto_reverse) {			t = (t<0)?0:(t>m_d?m_d:t);			return t;		}			time_type d = 2*m_d;		t = (t<0)?0:(t>d?d:t);		return (t<=m_d)?t:(m_d - (t-m_d));	}		// t in [0, dur]	// to preserve duration max speed m should be:	// d = accTriangle + constRectangle + decTriangle = a*d*m/2 + (d-b*d-a*d)*m + b*d*m/2	// therefore max speed m = 1 / (1 - a/2 - b/2)	time_type accelerate(time_type t) const {		t = (t<0)?0:(t>m_d?m_d:t);		double a = m_accelerate;		double b = m_decelerate;		if(a == 0.0 && b == 0.0) return t;		double d = m_d;		double ad = a*d;		double bd = b*d;		double t2 = t*t;		double dt2 = (d-t)*(d-t);		double m = 1.0/(1.0 - 0.5*a - 0.5*b);		double tp = 0.0;		if(t<=ad)			tp = 0.5*m*t2/ad;		else if(t>=a*d && t<=(d-bd))			tp = 0.5*m*ad + (t-ad)*m;		else if(t>=(d-bd) && t<=d)			tp = d - 0.5*m*dt2/bd;		assert(tp>=0.0 && tp<=d);		return time_type(floor(tp+0.5));	}		// A simple function is defined for the interval [0, d]	double m_accelerate;	double m_decelerate;	bool m_auto_reverse;	};// Simple duration animation function for continues attributes // The attribute type is T// T must define operator minus and multiplication/division with an int or double // T must have a copy constructor//template<class T>class linear_map_f : public simple_animation_f {  public:	typedef T value_type;	typedef std::map<time_type, value_type> map_type;	typedef typename map_type::const_iterator const_map_iterator;		value_type at(time_type t) const {		t = manipulated(t);		const_map_iterator eit = m_ktv.upper_bound(t);		const_map_iterator bit = eit;bit--;		if(eit == m_ktv.end()) return (*bit).second;		time_type dt = t - (*bit).first;		time_type dd = (*eit).first - (*bit).first;		value_type v1 = (*bit).second;		value_type v2 = (*eit).second;		return v1 + ((v2-v1)*dt)/dd;	}		value_type at(time_type t, const value_type& u) const {		return at(t);	}		time_type dur() const {		assert(m_d == (*m_ktv.rbegin()).first - (*m_ktv.begin()).first);		return m_d;	}		map_type& get_time_values_map() { return m_ktv;}	void init(time_type duration, T val) {		m_d = duration;		m_ktv.clear();		m_ktv[0]=val;		m_ktv[duration]=val;	}	void init(time_type duration, T from, T to) {		m_d = duration;		m_ktv.clear();		m_ktv[0]=from;		m_ktv[duration]=to;	}	void init(time_type duration, const std::vector<T>& vals) {		assert(!vals.empty());		m_d = duration;		int n = int(vals.size());		if(n==1) {			init(duration, vals[0]);		} else if(n==2) {			init(duration, vals[0], vals[1]);		} else { 			m_ktv.clear();			time_type to = 0;			for(int i=0;i<n;i++, to+=duration)				m_ktv[to/(n-1)] = vals[i];		}	}		void init(time_type duration, const std::vector<T>& vals, const std::vector<double>& keyTimes) {		assert(!vals.empty());		m_d = duration;		int n = int(vals.size());		if(n==1) {			init(duration, vals[0]);		} else if(n==2) {			init(duration, vals[0], vals[1]);		} else {			// assumes keyTimes have been verified and thus 			// the following assertions evaluate to true			assert(keyTimes.front() == 0.0);			assert(keyTimes.back() == 1.0);			assert(vals.size() == keyTimes.size());			for(int j=1;j<n;j++) assert(keyTimes[j]>keyTimes[j-1]);			m_ktv.clear();			for(int i=0;i<n;i++) {				time_type t = time_type(floor(keyTimes[i]*duration + 0.5));				m_ktv[t] = vals[i];			}		}	}		void paced_init(time_type duration, const std::vector<T>& vals) {		assert(!vals.empty());		m_d = duration;		int n = int(vals.size());		if(n==1) {			init(duration, vals[0]);		} else if(n==2) {			init(duration, vals[0], vals[1]);		} else { 			m_ktv.clear();			double length = 0.0;			for(int i1=1;i1<n;i1++) length += dist(vals[i1-1], vals[i1]);			double dl = 0;			m_ktv[0] = vals[0];			for(int i2=1;i2<n;i2++) {				dl += dist(vals[i2-1], vals[i2]);				time_type t = time_type(::floor(0.5+duration*dl/length));				m_ktv[t] = vals[i2];			}				}	}  private:		map_type m_ktv;	};// Simple duration animation function for discrete attributes // The attribute type is T// T must have a copy constructor//template<class T>class discrete_map_f : public simple_animation_f {  public:	typedef T value_type;	typedef std::map<time_type, value_type> map_type;	typedef typename map_type::const_iterator const_map_iterator;  	value_type at(time_type t) const {		assert(!m_ktv.empty());		t = manipulated(t);		const_map_iterator eit = m_ktv.upper_bound(t);		const_map_iterator bit = eit;bit--;		return (*bit).second;	}		value_type at(time_type t, const value_type& u) const {		return at(t);	}		map_type& get_time_values_map() { return m_ktv;}	void init(time_type duration, T val) {		m_d = duration;		m_ktv.clear();		m_ktv[0]=val;	}	void init(time_type duration, T from, T to) {		m_d = duration;		m_ktv.clear();		m_ktv[0]=from;		m_ktv[duration/2]=to;	}	void init(time_type duration, const std::vector<T>& vals) {		assert(!vals.empty());		m_d = duration;		int n = int(vals.size());		if(n==1) {			init(duration, vals[0]);		} else if(n==2) {			init(duration, vals[0], vals[1]);		} else { 			m_ktv.clear();			time_type to = 0;			for(int i=0;i<n;i++, to+=duration)				m_ktv[to/n] = vals[i];		}	}		void init(time_type duration, const std::vector<T>& vals, const std::vector<double>& keyTimes) {		assert(!vals.empty());		m_d = duration;		int n = int(vals.size());		// assumes keyTimes have been verified and thus 		// the following assertions evaluate to true		assert(keyTimes.front() == 0.0);		assert(keyTimes.back()<=1.0);				assert(vals.size() == keyTimes.size());		for(int j=1;j<n;j++) assert(keyTimes[j]>keyTimes[j-1]);		if(n==1) {			init(duration, vals[0]);		} else if(n==2) {			m_ktv.clear();			m_ktv[0]= vals[0];			time_type t = time_type(floor(keyTimes[1]*duration + 0.5));			m_ktv[t] = vals[1];		} else { 			m_ktv.clear();			for(int i=0;i<n;i++) {				time_type t = time_type(floor(keyTimes[i]*duration + 0.5));				m_ktv[t] = vals[i];			}		}	}	void paced_init(long duration, const std::vector<T>& vals) {		init(duration, vals);	}	  private:		map_type m_ktv;	};// Simple duration animate function for "to" aninationstemplate<class T>class underlying_to_f : public simple_animation_f {  public:	typedef T value_type;			value_type at(time_type t) const {		return at(t, value_type());	}		value_type at(time_type t, const T& u) const {		t = manipulated(t);			return (u*(m_d-t))/m_d + (m_v*t)/m_d;	}		void init(time_type duration, value_type v) {		m_d = duration; m_v = v;	}	   private:		value_type m_v;};//// Lifetime animation function//// Template arg F : simple duration animate function// F requirements:// F should define the types: time_type and value_type// F should implement:// value_type at(time_type t) const;// value_type at(time_type t, const value_type& u) const;//template <class F>class animate_f {  public:	typedef typename F::time_type time_type;	typedef typename F::value_type value_type;		animate_f(const F& f, time_type sd, time_type ad, bool cum = false)	:	m_f(f), m_sd(sd), m_ad(ad), m_cum(cum) {}		value_type at(time_type t) const {		if(t<=m_ad) return m_cum?(m_f.at(m_sd)*(t/m_sd) + m_f.at(t%m_sd)):m_f.at(t%m_sd);		if((m_ad%m_sd) != 0) return this->at(m_ad);		assert((m_ad%m_sd) == 0);		return m_cum?m_f.at(m_sd)*(m_ad/m_sd):m_f.at(m_sd);	}		value_type at(time_type t, const value_type& u) const {		if(t<=m_ad) return m_cum?(m_f.at(m_sd, u)*(t/m_sd) + m_f.at(t%m_sd, u)):m_f.at(t%m_sd, u);		if((m_ad%m_sd) != 0) return this->at(m_ad, u);		assert((m_ad%m_sd) == 0);		return m_cum?m_f.at(m_sd, u)*(m_ad/m_sd):m_f.at(m_sd, u);	}	#if 0	// Unused, and I don't know what they should return.	bool set_cumulative(bool c) { m_cum = c;}	bool update_ad(time_type ad) { m_ad = ad;}	bool update_sd(time_type sd) { m_sd = sd;}#endif		const F& m_f;	time_type m_sd;	time_type m_ad;	bool m_cum;};enum calc_mode_t {cm_linear, cm_discrete, cm_paced, cm_spline};void create_bezier_map(double *e, std::map<double, double>& gr) {	const int n = 20;	double step = 1.0/double(n);	double s = 0.0;	for(int i=0;i<=n;i++) {		double sc = 1.0-s;		double b = 3.0*sc*sc*s;		double c = 3.0*sc*s*s;		double d = s*s*s;		double t = b*e[0] + c*e[2] + d;		double tp = b*e[1] + c*e[3] + d;		gr[t] = tp;		s = s + step;	}}// Distance for scalarstemplate <class T>double dist(const T& v1, const T& v2) {	return std::max(v1, v2) - std::min(v1, v2); }// Distance specialization for common::region_dimtemplate <>inline double dist(const ambulant::common::region_dim& rd1, const ambulant::common::region_dim& rd2) {	if(rd1.relative())		return std::max(rd1.get_as_dbl(), rd2.get_as_dbl()) - std::min(rd1.get_as_dbl(), rd2.get_as_dbl());	else if(rd1.absolute())		return std::max(rd1.get_as_int(), rd2.get_as_int()) - std::min(rd1.get_as_int(), rd2.get_as_int());	return 0;}// Distance specialization for lib::pointtemplate <>double dist(const lib::point& p1, const lib::point& p2) {	double dx = double(p2.x - p1.x);	double dy = double(p2.y - p1.y);	return ::sqrt(dx*dx + dy*dy); }// Distance specialization for lib::color_ttemplate <>double dist(const lib::color_t& c1, const lib::color_t& c2) {	double dr = double(lib::redc(c2) - lib::redc(c1));	double dg = double(lib::greenc(c2) - lib::greenc(c1));	double db = double(lib::bluec(c2) - lib::bluec(c1));	return ::sqrt(dr*dr + dg*dg + db*db); }} // namespace smil2 } // namespace ambulant#endif // AMBULANT_SMIL2_ANIMATE_F_H

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色婷婷综合久久久久中文一区二区| 精品精品欲导航| 911精品产国品一二三产区| 91精品啪在线观看国产60岁| 一本色道久久加勒比精品| 欧美吞精做爰啪啪高潮| 精品剧情v国产在线观看在线| 中文字幕日韩一区| 日韩av电影免费观看高清完整版 | 成人一级黄色片| 欧美偷拍一区二区| 久久精品视频免费| 亚洲第一成年网| 91免费视频网| 久久久久久免费网| 一区在线播放视频| 国产91精品一区二区| 欧美精品在线一区二区| 国产精品美女久久久久久久网站| 美女视频网站久久| 日本黄色一区二区| 国产欧美一区二区精品久导航| 日韩激情在线观看| 91久久线看在观草草青青| 久久精品一区四区| 亚洲777理论| 在线观看国产91| 中文字幕+乱码+中文字幕一区| 亚洲chinese男男1069| 欧美午夜一区二区三区| 国产精品全国免费观看高清 | 久久亚洲春色中文字幕久久久| 日韩精品电影一区亚洲| 欧洲视频一区二区| 亚洲欧美日韩系列| 色8久久人人97超碰香蕉987| 中文字幕一区二区在线观看| 国产白丝网站精品污在线入口| 久久影视一区二区| 久久99九九99精品| 日韩一区二区电影在线| 捆绑紧缚一区二区三区视频| 欧美日韩综合在线| 一级日本不卡的影视| 韩国av一区二区三区在线观看| 91精品国产麻豆| 日本三级韩国三级欧美三级| 欧美在线一区二区三区| 丝袜美腿亚洲色图| 91精品久久久久久久99蜜桃| 一区二区三区在线视频观看58| 欧美在线看片a免费观看| 亚洲天堂精品在线观看| aa级大片欧美| 亚洲欧美日韩国产中文在线| www.亚洲国产| 国产亚洲欧美色| 国产suv精品一区二区883| 亚洲精品一区二区三区在线观看| 久久99国产精品久久99| 久久一夜天堂av一区二区三区| 成人av在线一区二区三区| 国产精品系列在线| 一本久道久久综合中文字幕| 日韩影院免费视频| 精品国产免费视频| 国产98色在线|日韩| 曰韩精品一区二区| 欧美精品一二三| 捆绑调教一区二区三区| 亚洲同性gay激情无套| 91福利在线观看| 免费在线观看视频一区| 国产精品少妇自拍| 91久久香蕉国产日韩欧美9色| 午夜精品一区二区三区三上悠亚| 久久久久久影视| 99久久99久久综合| 婷婷综合另类小说色区| 欧美国产日本韩| 欧洲精品在线观看| 九九精品一区二区| 一区二区三区不卡视频在线观看| 欧美四级电影在线观看| 麻豆久久久久久| 亚洲国产欧美日韩另类综合| 日韩免费电影一区| 99视频热这里只有精品免费| 日日噜噜夜夜狠狠视频欧美人| 亚洲精品一区二区三区福利 | 99精品久久免费看蜜臀剧情介绍| 亚洲大型综合色站| 色香蕉久久蜜桃| 国产精品99久| 亚洲国产视频在线| 久久综合色鬼综合色| 99久久国产综合色|国产精品| 日精品一区二区三区| 99精品黄色片免费大全| 国产乱对白刺激视频不卡| 亚洲一区二三区| 亚洲欧美国产77777| 精品国产一区二区三区久久影院 | 日精品一区二区| 中文字幕一区二区视频| 国产色爱av资源综合区| 日韩一区二区在线看| eeuss鲁片一区二区三区在线看| 久久99最新地址| 天堂一区二区在线免费观看| 亚洲人123区| 欧美国产1区2区| 精品欧美一区二区在线观看| 欧美亚男人的天堂| 91蜜桃网址入口| 成人综合日日夜夜| 国产一区二区三区av电影| 日韩国产在线观看一区| 亚洲一区二区三区三| 亚洲免费在线视频| 亚洲视频中文字幕| 久久精品人人做人人综合| 欧美老女人在线| 日韩视频国产视频| 在线观看亚洲a| 91精品国产乱| 欧美一区二区三区公司| 欧美电影精品一区二区| 欧美一级高清片| 正在播放一区二区| 欧美精品一区二区三区高清aⅴ| 欧美精品欧美精品系列| 欧美日韩日日夜夜| 日韩免费福利电影在线观看| 91麻豆精品久久久久蜜臀| 91免费观看视频在线| 欧美日韩国产一级二级| 欧美日韩高清一区| 欧美成人三级电影在线| 欧美www视频| 久久久99精品久久| 亚洲黄色免费电影| 亚洲成人动漫av| 天天操天天干天天综合网| 亚洲成国产人片在线观看| 日本成人中文字幕| 国产一区二区三区免费在线观看| 国产麻豆视频一区二区| 91丨国产丨九色丨pron| 精品视频全国免费看| 欧美老女人在线| 国产精品美女久久久久高潮| 成人欧美一区二区三区小说| 亚洲黄一区二区三区| 天天做天天摸天天爽国产一区 | 激情都市一区二区| 91在线观看一区二区| 欧美日韩精品免费| 精品毛片乱码1区2区3区| 亚洲精品亚洲人成人网在线播放| 亚洲国产精品影院| 久久超碰97人人做人人爱| 91视频国产观看| 日韩三级免费观看| 中文字幕一区二区三区不卡在线| 亚洲成av人片在线观看| 久久精品国产精品亚洲精品| 在线观看91精品国产入口| 欧美一区日本一区韩国一区| 欧美韩日一区二区三区四区| 亚洲福中文字幕伊人影院| 精品在线播放免费| 色欧美日韩亚洲| 精品日韩欧美在线| 中文字幕在线一区| 狠狠色伊人亚洲综合成人| 91浏览器打开| 国产精品三级av| 久久狠狠亚洲综合| 色欧美88888久久久久久影院| 久久久五月婷婷| 爽好多水快深点欧美视频| 色综合天天综合狠狠| 日韩欧美一级在线播放| 亚洲精品视频观看| 99久久婷婷国产精品综合| 日韩精品一区二区三区在线观看| 国产日韩欧美不卡在线| 日本不卡免费在线视频| 97超碰欧美中文字幕| 亚洲国产精品国自产拍av| 强制捆绑调教一区二区| 色综合欧美在线| 亚洲激情图片qvod| 成人高清视频免费观看| 欧美精品v国产精品v日韩精品| 国产精品久久久久国产精品日日| 青青草国产精品亚洲专区无| 在线播放一区二区三区| 亚洲一区免费视频|