J'ai une fonction qui retourne un objet avec la meilleure note parmi un ensemble d'objets. Maintenant, je veux obtenir l'objet avec la meilleure note qui est la plus proche d'un certain point. Fondamentalement, je veux permettre à une petite violation de la formule, de sorte que si O_1 est plus proche du point donné que O_2 même si argmax d'une fonction permettant de petites violations
si
Actuellement, je réalise avec environ 5 instructions if dans un programme, mais je me demandais s'il y avait un moyen de représenter cela d'une manière plus propre et plus élégante avec une formule mathématique peut-être? Si vous avez déjà eu un problème comme celui-ci, comment l'avez-vous codé?
Voici un extrait du code que j'ai, je sais qu'il y a quelques refactorisations qui pourraient être faites aux instructions if, je voulais rendre les cas plus clairs. Y a-t-il une manière plus élégante de résoudre ceci?
public VisualDevice MostSuitableDevice(GameObject u, GameObject t, List<VisualDevice> D)
{
float maxSuitability = 0;
VisualDevice mostSuitableDevice = null;
float epsMaxSuitability = 0;
VisualDevice epsMSD = null;
foreach (VisualDevice d in D)
{
float suitability = Rating(d, u, t);
bool closerDevice = mostSuitableDevice != null ? Vector3.Distance(d.GetLightPosition(), t.transform.position) < Vector3.Distance(mostSuitableDevice.GetLightPosition(), t.transform.position) : false;
if (suitability > maxSuitability && closerDevice)
{
maxSuitability = suitability;
mostSuitableDevice = d;
}
else if (suitability > maxSuitability + epsilon)
{
maxSuitability = suitability;
mostSuitableDevice = d;
}
else if (suitability + epsilon > maxSuitability && closerDevice)
{
closerDevice = epsMSD != null ? Vector3.Distance(d.GetLightPosition(), t.transform.position) < Vector3.Distance(epsMSD.GetLightPosition(), t.transform.position) : false;
if (suitability > epsMaxSuitability && closerDevice)
{
epsMaxSuitability = suitability;
epsMSD = d;
}
else if (suitability > epsMaxSuitability + epsilon)
{
epsMaxSuitability = suitability;
epsMSD = d;
}
else if (suitability + epsilon > epsMaxSuitability && closerDevice)
{
epsMaxSuitability = suitability;
epsMSD = d;
}
}
}
bool epsCloser = epsMSD != null && mostSuitableDevice!=null ? Vector3.Distance(epsMSD.GetLightPosition(), t.transform.position) < Vector3.Distance(mostSuitableDevice.GetLightPosition(), t.transform.position) : false;
if (epsMaxSuitability + epsilon > maxSuitability && epsCloser)
{
maxSuitability = epsMaxSuitability;
mostSuitableDevice= epsMSD;
}
return mostSuitableDevice;
}
Qu'est-ce qu'une mesure pour "proximité"? – MBo
Votre question n'est pas claire, comme le laisse entendre le commentaire précédent. S'il vous plaît montrez votre "environ 5" if "déclarations" pour clarifier la question et pour montrer que vous avez fait un travail important sur le problème. Plus d'explications sur "plus proche d'un certain point" aiderait aussi. –
@MBo disjoncteur euclédien juste à un objet cible/emplacement – Girauder