/** Utility function that calculates filling factor */ const float CalculateFillingFactor(const FSphere& ASphere, const float AFillingFactor, const FSphere& BSphere, const float BFillingFactor) { const float OverlapVolume = CalculateOverlap( ASphere, AFillingFactor, BSphere, BFillingFactor); FSphere UnionSphere = ASphere + BSphere; // it shouldn't be zero or it should be checked outside ensure(UnionSphere.W != 0.f); // http://deim.urv.cat/~rivi/pub/3d/icra04b.pdf // cost is calculated based on r^3 / filling factor // since it subtract by AFillingFactor * 1/2 overlap volume + BfillingFactor * 1/2 overlap volume return FMath::Max(0.0f, (AFillingFactor * ASphere.GetVolume() + BFillingFactor * BSphere.GetVolume() - OverlapVolume) / UnionSphere.GetVolume()); }
void ApplyNoteExpulsion (FloatNote * psNote, NotesPersist * psNotesData) { float fXForce, fYForce; FloatNote * psNoteCount; GSList * psNoteListPos; float fCoverage; float fXDirection, fYDirection, fLength; float fFade; fXForce = 0.0f; fYForce = 0.0f; psNoteListPos = psNotesData->psNoteList; while (psNoteListPos) { psNoteCount = (FloatNote *)psNoteListPos->data; if (psNoteCount != psNote) { // Calculate fade fFade = (1.0f - ((psNoteCount->vsAnchor.fZ - psNotesData->fFocusFar + NOTE_FOCUSSHIFT) * NOTE_FOCUSFADE)); if ((psNoteCount->szText->len > 0) && (fFade > 0.0f) && (fFade < 50.0f)) { // Calculate coverage fCoverage = CalculateOverlap (psNote->vsPos.fX, psNote->vsSize.fX, psNoteCount->vsPos.fX, psNoteCount->vsSize.fX) * CalculateOverlap (psNote->vsPos.fY, psNote->vsSize.fY, psNoteCount->vsPos.fY, psNoteCount->vsSize.fY); if (fCoverage > 0.0f) { fXDirection = ((psNote->vsPos.fX + (psNote->vsSize.fX / 2.0f)) - (psNoteCount->vsPos.fX + (psNoteCount->vsSize.fX / 2.0f))); fYDirection = ((psNote->vsPos.fY + (psNote->vsSize.fY / 2.0f)) - (psNoteCount->vsPos.fY + (psNoteCount->vsSize.fY / 2.0f))); fLength = sqrt ((fXDirection * fXDirection) + (fYDirection * fYDirection)); fXForce += psNotesData->fExpulsion * (40.0f + fCoverage) * fXDirection * fFade / fLength; fYForce += psNotesData->fExpulsion * (40.0f + fCoverage) * fYDirection * fFade / fLength; } } } psNoteListPos = psNoteListPos->next; } psNote->vsVel.fX += 0.01f * fXForce; psNote->vsVel.fY += 0.01f * fYForce; }