Beispiel #1
0
void simple_min_sort(int* input, int input_size, int k) {
    if(0 == input) return;
    for(int i=0; i<input_size; i+=k) {
        int min_position = min_pos(input + i, input_size - i, k) + i;
        swap(input + i, input + min_position);
    }
}
Beispiel #2
0
Datei: tab.c Projekt: Exy13/Tp-C
void select_sort(int arr[], size_t len) 
{
  for (size_t i = 0; i < len - 2; i++)
  {
    swap(&arr[i], min_pos(arr + i, len - i));
  }
}
Beispiel #3
0
void select_sort(int arr[], size_t len) 
{
	for(unsigned long i = 0; i< len; i++)
	{
	 	int* min = min_pos(arr + i, len - i);
		swap(min, &(arr[i]));
	}
}
void CMarchingCubeRenderer::Process()
{
	if(m_bInitialized) return;
		m_bInitialized = true;

	int sizeX = m_displayData->GetSizeX();
	int sizeY = m_displayData->GetSizeY();
	int sizeZ = m_displayData->GetSizeZ();

	//计算三个方向的长度,将它缩放到 1x1x1的范围内
	//中心在(0.5,0.5,0.5)
	vector3df * _3dPosition = new vector3df[sizeX*sizeY*sizeZ];
	int posIndex = 0;
//#define max(a,b) ((a)>(b)?(a):(b))
	//float voxelSize = 1.0f/(max(max(sizeX,sizeY),sizeZ));
	float voxelSize = 1.0f;
//#undef max

	float fscale = 1.0f/(std::max(sizeX*m_displayData->GetScaleX(),std::max(sizeY*m_displayData->GetScaleY(),sizeZ*m_displayData->GetScaleZ())));
	
	kk::core::vector3df min_pos(0,0,0);
	kk::core::vector3df max_pos(sizeX*m_displayData->GetScaleX()*fscale,
		sizeY*m_displayData->GetScaleY()*fscale,
		sizeZ*m_displayData->GetScaleZ()*fscale);
	float maxValue = 1.0f/std::max(std::max(max_pos.X,max_pos.Y),max_pos.Z);
	max_pos *= maxValue;
	//中心为
	kk::core::vector3df center = (min_pos + max_pos)*0.5f;
	//是要移动到(0.5,0.5,0.5),所以偏移量为:
	kk::core::vector3df offset=kk::core::vector3df(0.5,0.5,0.5) - center;
	for(int x=0;x<sizeX;x++)
	for(int y=0;y<sizeY;y++)
	for(int z=0;z<sizeZ;z++)
	{
		posIndex = x+y*sizeX+z*sizeX*sizeY;
		//最大轴变为了1
		_3dPosition[posIndex].X = x*m_displayData->GetScaleX()*fscale   +offset.X;
		_3dPosition[posIndex].Y = y*m_displayData->GetScaleY()*fscale   +offset.Y;
		_3dPosition[posIndex].Z = z*m_displayData->GetScaleZ()*fscale   +offset.Z;
		//移动到中心来
		//就加上了偏移
		//posIndex++;
	}
	vector3df origin;//(-10,-10,-10);
	origin.X=0;
	origin.Y=0;
	origin.Z=0;
	//if(mc)
	//	delete mc;
	mc = new MarchingCube(sizeX, sizeY, sizeZ, (float*)(m_displayData->GetRawData()),
		_3dPosition, origin, voxelSize, 0.95f);
	
	//delete[] _3dPosition;
}
Beispiel #5
0
double		inter_cylindre(t_pos xyz, t_win mw, int i)
{
  double	var[10];
  t_calc	disc;

  calcul_cylindre(var, &xyz, &mw, i);
  inter_disque_cyl(xyz, mw, &disc, i);
  if ((disc.x * disc.x) + (disc.y * disc.y) <= (mw.tab_obj[i].rayon *
						mw.tab_obj[i].rayon))
    return (min_pos(disc.k, var[0]));
  if ((disc.x2 * disc.x2) + (disc.y2 * disc.y2) <= (mw.tab_obj[i].rayon *
						    mw.tab_obj[i].rayon))
    return (min_pos(disc.k2, var[0]));
  if (var[7] < -mw.tab_obj[i].taille / 2 ||
      var[7] > mw.tab_obj[i].taille / 2 &&
      (var[8] < -mw.tab_obj[i].taille / 2 ||
       var[8] > mw.tab_obj[i].taille / 2))
       return (-1);
  if (var[1] >= 0)
    return (var[0]);
}
Beispiel #6
0
INLINE_IF_HEADER_ONLY Annotation const DomainGraph::
annotate ( Component const& vertices ) const {
  uint64_t D = data_ ->parameter_ . network() . size ();
  std::vector<uint64_t> limits = data_ -> parameter_ . network() . domains ();
  std::vector<uint64_t> domain_indices ( vertices.begin(), vertices.end() );
  std::vector<uint64_t> min_pos(D);
  std::vector<uint64_t> max_pos(D);
  for ( int d = 0; d < D; ++ d ) {
    min_pos[d] = limits[d];
    max_pos[d] = 0;
  }
  for ( int d = 0; d < D; ++ d ) {
    for ( uint64_t & v : domain_indices ) {
      uint64_t pos = v % limits[d];
      v = v / limits[d];
      min_pos[d] = std::min(min_pos[d], pos);
      max_pos[d] = std::max(max_pos[d], pos);
    }
  }
  std::vector<uint64_t> signature;
  for ( int d = 0; d < D; ++ d ) {
    if ( min_pos[d] != max_pos[d] ) {
      signature . push_back ( d );
    }
  }
  Annotation a;
  std::stringstream ss;
  if ( signature . size () == 0 ) {
    ss << "FP";
    bool all_on = true;
    bool all_off = true;
    for ( int d = 0; d < D; ++ d ) {
      if ( min_pos[d] == 0 ) all_on = false;
      else all_off = false;
    }
    if ( all_on ) ss << " ON";
    if ( all_off) ss << " OFF";
  } else if ( signature . size () == D ) {
    ss << "FC";
  } else {
    ss << "XC {";
    bool first_term = true;
    for ( uint64_t d : signature ) {
      if ( first_term ) first_term = false; else ss << ", ";
      ss << data_ ->parameter_ . network() . name ( d );
    }
    ss << "}";
  }
  a . append ( ss . str () );
  return a;
}
Beispiel #7
0
int Ca_Axis_::update(){

  double _k=k_;
  double _q=q_;
  min_pos_=min_pos();
  max_pos_=max_pos();
  if (min_==max_)
    k_=0;
  else
    if(scale_ & CA_LOG){
      k_=(max_pos_-min_pos_)/(log(max_)-log(min_));
      q_=min_pos_-k_*log(min_);
    }else{
      k_=(max_pos_-min_pos_)/(max_-min_);
      q_=min_pos_;
    }

    if((_k!=k_)||(_q!=q_))
      return 1;
    else
      return 0;
};
Beispiel #8
0
void		calcul_cylindre(double *var, t_pos *xyz, t_win *mw, int i)
{
  rotate_trans(xyz, mw, i);
  var[2] = xyz->x * xyz->x + xyz->y * xyz->y;
  var[3] = 2.0 * (mw->p_oeil.x * xyz->x + mw->p_oeil.y * xyz->y);
  var[4] = mw->p_oeil.x * mw->p_oeil.x + mw->p_oeil.y * mw->p_oeil.y -
    mw->tab_obj[i].rayon * mw->tab_obj[i].rayon;
  var[1] = var[3] * var[3] - 4.0 * var[2] * var[4];
  var[5] = (-var[3] + sqrt(var[1])) / (2 * var[2]);
  var[6] = (-var[3] - sqrt(var[1])) / (2 * var[2]);
  var[0] = min_pos(var[5], var[6]);
  if (var[5] > var[6])
    {
      var[7] = mw->p_oeil.z + var[6] * xyz->z;
      var[8] = mw->p_oeil.z + var[5] * xyz->z;
    }
  else
    {
      var[7] = mw->p_oeil.z + var[5] * xyz->z;
      var[8] = mw->p_oeil.z + var[6] * xyz->z;
    }
}
sf::Vector2i ShipTemplate::interiorSize()
{
    sf::Vector2i min_pos(1000, 1000);
    sf::Vector2i max_pos(0, 0);
    for(unsigned int n=0; n<rooms.size(); n++)
    {
        min_pos.x = std::min(min_pos.x, rooms[n].position.x);
        min_pos.y = std::min(min_pos.y, rooms[n].position.y);
        max_pos.x = std::max(max_pos.x, rooms[n].position.x + rooms[n].size.x);
        max_pos.y = std::max(max_pos.y, rooms[n].position.y + rooms[n].size.y);
    }
    if (min_pos != sf::Vector2i(1, 1))
    {
        sf::Vector2i offset = sf::Vector2i(1, 1) - min_pos;
        for(unsigned int n=0; n<rooms.size(); n++)
            rooms[n].position += offset;
        for(unsigned int n=0; n<doors.size(); n++)
            doors[n].position += offset;
        max_pos += offset;
    }
    max_pos += sf::Vector2i(1, 1);
    return max_pos;
}
Beispiel #10
0
int min_pos(int* input, int input_size) {
    min_pos(input, input_size, 1);
}
Beispiel #11
0
		void SubThreadStage()
		{
			ResIdentifierPtr psmm_input = ResLoader::Instance().Open(ps_desc_.res_name);

			KlayGE::XMLDocument doc;
			XMLNodePtr root = doc.Parse(psmm_input);

			{
				XMLNodePtr particle_node = root->FirstNode("particle");
				{
					XMLNodePtr alpha_node = particle_node->FirstNode("alpha");
					ps_desc_.ps_data->particle_alpha_from_tex = alpha_node->Attrib("from")->ValueString();
					ps_desc_.ps_data->particle_alpha_to_tex = alpha_node->Attrib("to")->ValueString();
				}
				{
					XMLNodePtr color_node = particle_node->FirstNode("color");
					{
						Color from;
						XMLAttributePtr attr = color_node->Attrib("from");
						if (attr)
						{
							std::vector<std::string> strs;
							boost::algorithm::split(strs, attr->ValueString(), boost::is_any_of(" "));
							for (size_t i = 0; i < 3; ++ i)
							{
								if (i < strs.size())
								{
									boost::algorithm::trim(strs[i]);
									from[i] = static_cast<float>(atof(strs[i].c_str()));
								}
								else
								{
									from[i] = 0;
								}
							}
						}
						from.a() = 1;
						ps_desc_.ps_data->particle_color_from = from;

						Color to;
						attr = color_node->Attrib("to");
						if (attr)
						{
							std::vector<std::string> strs;
							boost::algorithm::split(strs, attr->ValueString(), boost::is_any_of(" "));
							for (size_t i = 0; i < 3; ++ i)
							{
								if (i < strs.size())
								{
									boost::algorithm::trim(strs[i]);
									to[i] = static_cast<float>(atof(strs[i].c_str()));
								}
								else
								{
									to[i] = 0;
								}
							}
						}
						to.a() = 1;
						ps_desc_.ps_data->particle_color_to = to;
					}
				}
			}

			{
				XMLNodePtr emitter_node = root->FirstNode("emitter");

				XMLAttributePtr type_attr = emitter_node->Attrib("type");
				if (type_attr)
				{
					ps_desc_.ps_data->emitter_type = type_attr->ValueString();
				}
				else
				{
					ps_desc_.ps_data->emitter_type = "point";
				}

				XMLNodePtr freq_node = emitter_node->FirstNode("frequency");
				if (freq_node)
				{
					XMLAttributePtr attr = freq_node->Attrib("value");
					ps_desc_.ps_data->frequency = attr->ValueFloat();
				}

				XMLNodePtr angle_node = emitter_node->FirstNode("angle");
				if (angle_node)
				{
					XMLAttributePtr attr = angle_node->Attrib("value");
					ps_desc_.ps_data->angle = attr->ValueInt() * DEG2RAD;
				}

				XMLNodePtr pos_node = emitter_node->FirstNode("pos");
				if (pos_node)
				{
					float3 min_pos(0, 0, 0);
					XMLAttributePtr attr = pos_node->Attrib("min");
					if (attr)
					{
						std::vector<std::string> strs;
						boost::algorithm::split(strs, attr->ValueString(), boost::is_any_of(" "));
						for (size_t i = 0; i < 3; ++ i)
						{
							if (i < strs.size())
							{
								boost::algorithm::trim(strs[i]);
								min_pos[i] = static_cast<float>(atof(strs[i].c_str()));
							}
							else
							{
								min_pos[i] = 0;
							}
						}
					}
					ps_desc_.ps_data->min_pos = min_pos;
			
					float3 max_pos(0, 0, 0);
					attr = pos_node->Attrib("max");
					if (attr)
					{
						std::vector<std::string> strs;
						boost::algorithm::split(strs, attr->ValueString(), boost::is_any_of(" "));
						for (size_t i = 0; i < 3; ++ i)
						{
							if (i < strs.size())
							{
								boost::algorithm::trim(strs[i]);
								max_pos[i] = static_cast<float>(atof(strs[i].c_str()));
							}
							else
							{
								max_pos[i] = 0;
							}
						}
					}			
					ps_desc_.ps_data->max_pos = max_pos;
				}

				XMLNodePtr vel_node = emitter_node->FirstNode("vel");
				if (vel_node)
				{
					XMLAttributePtr attr = vel_node->Attrib("min");
					ps_desc_.ps_data->min_vel = attr->ValueFloat();

					attr = vel_node->Attrib("max");
					ps_desc_.ps_data->max_vel = attr->ValueFloat();
				}

				XMLNodePtr life_node = emitter_node->FirstNode("life");
				if (life_node)
				{
					XMLAttributePtr attr = life_node->Attrib("min");
					ps_desc_.ps_data->min_life = attr->ValueFloat();

					attr = life_node->Attrib("max");
					ps_desc_.ps_data->max_life = attr->ValueFloat();
				}
			}

			{
				XMLNodePtr updater_node = root->FirstNode("updater");

				XMLAttributePtr type_attr = updater_node->Attrib("type");
				if (type_attr)
				{
					ps_desc_.ps_data->updater_type = type_attr->ValueString();
				}
				else
				{
					ps_desc_.ps_data->updater_type = "polyline";
				}

				if ("polyline" == ps_desc_.ps_data->updater_type)
				{
					for (XMLNodePtr node = updater_node->FirstNode("curve"); node; node = node->NextSibling("curve"))
					{
						std::vector<float2> xys;
						for (XMLNodePtr ctrl_point_node = node->FirstNode("ctrl_point"); ctrl_point_node; ctrl_point_node = ctrl_point_node->NextSibling("ctrl_point"))
						{
							XMLAttributePtr attr_x = ctrl_point_node->Attrib("x");
							XMLAttributePtr attr_y = ctrl_point_node->Attrib("y");

							xys.push_back(float2(attr_x->ValueFloat(), attr_y->ValueFloat()));
						}

						XMLAttributePtr attr = node->Attrib("name");
						size_t const name_hash = RT_HASH(attr->ValueString().c_str());
						if (CT_HASH("size_over_life") == name_hash)
						{
							ps_desc_.ps_data->size_over_life_ctrl_pts = xys;
						}
						else if (CT_HASH("mass_over_life") == name_hash)
						{
							ps_desc_.ps_data->mass_over_life_ctrl_pts = xys;
						}
						else if (CT_HASH("opacity_over_life") == name_hash)
						{
							ps_desc_.ps_data->opacity_over_life_ctrl_pts = xys;
						}
					}
				}
			}

			RenderFactory& rf = Context::Instance().RenderFactoryInstance();
			RenderDeviceCaps const & caps = rf.RenderEngineInstance().DeviceCaps();
			if (caps.multithread_res_creating_support)
			{
				this->MainThreadStage();
			}
		}