void utest4() { int legend[] = {4, 2, 2, 0}; BSArenaPuzzle pz(10, legend); std::cout << pz << std::endl; pz.apply_result(BSPoint(3, 3), BSArena::r_continue_in_that_direction); pz.apply_result(BSPoint(6, 6), BSArena::r_continue_in_that_direction); std::cout << pz << std::endl; std::cout << "===" << std::endl; BSPoint p = pz.find_fire(); std::cout << "===" << std::endl; std::cout << p << std::endl; std::cout << "===" << std::endl; }
void vtest1() { int legend[] = {3, 1, 1, 0}; BSArenaPuzzle pz(10, legend); std::cout << pz << std::endl; pz.apply_result(BSPoint(2, 3), BSArena::r_milk); pz.apply_result(BSPoint(3, 2), BSArena::r_milk); pz.apply_result(BSPoint(3, 3), BSArena::r_continue_in_that_direction); pz.apply_result(BSPoint(3, 5), BSArena::r_drowned); std::cout << "____________" << std::endl; std::cout << pz << std::endl; std::cout << "___SEARCH___" << std::endl; BSPoint p = pz.find_fire(); }
// -------------------------------------------------------------------------------------------- // Maus wurde bewegt HRESULT CVertexAdd::MouseMove (LPARAM lParam) { if (! m_wDragObj.IsValid()) // StützpunktHinzufügen schon beendet return S_OK; m_ptMSp = BSPoint (lParam); // BS-Punkt der Mausspitze // bisherige Position des Markierungsquadrates löschen (jedoch nicht beim allerersten Mal) if (m_bNotFirst) m_pVWnd->Draw (m_pMk); m_pMk->Process (m_ptMSp); // neue Position einstellen m_pVWnd->Draw (m_pMk); // neue Position zeichnen m_bNotFirst = true; // die neuen Strecken als "Gummiband" mitziehen m_wDragObj->SetEndPoint ((POINT&)m_ptMSp, FALSE, TRUE); HRESULT hr = m_wTopObjs->CursorAtTopicalObjects (&m_NewCP, NULL, &m_lMSpX, &m_lMSpY, m_wActBelowObjs.ppi()); if (FAILED(hr)) return hr; if (m_NewCP == m_OldCP) return S_OK; m_OldCP = m_NewCP; // bisherige CursorPosition retten if (CURSPOS_VERTEX == m_NewCP && // Cursor in einer Stützpunktmarkierung und (GetKeyState (VK_SHIFT) >= 0) && // SHIFT-Taste nicht gedrückt, d.h. Grabben S_OK == m_wTopObjs->IsGrabAllowable (m_StartPkt.X(), m_StartPkt.Y(), m_lMSpX, m_lMSpY, m_wBelowObjs, m_wActBelowObjs, m_lEpsilon)) return m_wEdExSite->SetCursor (CURSFORM_FANGEN, TRUE); // CursorForm für Grabben return m_wEdExSite->SetCursor (CURSFORM_TRENNER, TRUE); } // MouseMove
// -------------------------------------------------------------------------------------------- // MouseMove ohne Konstruktionshilfslinien HRESULT CNewArea::MouseMoveWithoutRestrictLines (LPARAM lParam) { if (m_wDragObj.IsValid()) m_LastPt = BSPoint (lParam); HRESULT hr = m_wTopObjs->CursorInMarkerSomeTopObjects (m_wAllTObjs, &m_NewCP); if (FAILED(hr)) return hr; if (m_NewCP == m_OldCP) return S_OK; m_OldCP = m_NewCP; // bisherige CursorPosition retten if (CURSPOS_VERTEX == m_NewCP) // Cursor in einer Stützpunktmarkierung return m_wEdExSite->SetCursor (CURSFORM_FANGEN, TRUE); return m_wEdExSite->SetCursor (CURSFORM_CROSS, TRUE); } // MouseMoveWithoutRestrictLines
// -------------------------------------------------------------------------------------------- // den Cursor auf die this-Hilfslinie setzen HRESULT CRestrictLine::CursorTo1RestrictLine (LPARAM lParam, POINT* pPTCur) { Point MSPt = BSPoint (lParam); // BS-Punkt der Mausspitze if (RESTRTYPE_GERADE == m_ResType) { double dLotPX, dLotPY; GeradenLotPunkt (MSPt.X(), MSPt.Y(), m_EPt1.X(), m_EPt1.Y(), m_EPt2.X(), m_EPt2.Y(), dLotPX, dLotPY); pPTCur->x = DtoL (dLotPX); pPTCur->y = DtoL (dLotPY); } else if (RESTRTYPE_KREIS == m_ResType) { // Abstand der Mausposition vom Mittelpunkt der kreisförmigen Hilfslinie double dx = MSPt.X() - m_RefPt.X() - m_iRad; double dy = MSPt.Y() - m_RefPt.Y() - m_iRad; double dAbst = sqrt (dx*dx + dy*dy); if (0. == dAbst) return S_FALSE; pPTCur->x = m_RefPt.X() + m_iRad + DtoL (m_iRad*dx/dAbst); pPTCur->y = m_RefPt.Y() + m_iRad + DtoL (m_iRad*dy/dAbst); } else if (RESTRTYPE_STRECKE == m_ResType) { double dLotPX, dLotPY; GeradenLotPunkt (MSPt.X(), MSPt.Y(), m_EPt1.X(), m_EPt1.Y(), m_EPt2.X(), m_EPt2.Y(), dLotPX, dLotPY); CursorToStraight (MSPt, dLotPX, dLotPY, m_EPt1, m_EPt2, pPTCur); } return S_OK; } // CursorTo1RestrictLine
// -------------------------------------------------------------------------------------------- // den Cursor auf einen der gemeinsamen Punkte der this- und der pRestrLine2-Hilfslinie setzen; // return-Werte sind // S_OK: es ließ sich eine Cursorposition bestimmen // S_FALSE: die beiden Hilfslinien sind zu löschen, weil sie sich z. B. nicht oder nur // außerhalb des Bildschirm schneiden oder sonst ein Fehler aufgetreten ist HRESULT CRestrictLine::CursorTo2RestrictLines (LPARAM lParam, IRestrictLine* pRestrLine2, POINT* pPTCur) { Point MSPt = BSPoint (lParam); // BS-Punkt der Mausspitze RestrType ResType2; // Parameter der 2. Konstruktionshilfslinie Point EPt12, EPt22, RefPt2; int iRad2; KoOrd lFixX, lFixY; double dAngle; pRestrLine2->GetParameters (&ResType2, (POINT*)&EPt12, (POINT*)&EPt22, (POINT*)&RefPt2, &iRad2, &lFixX, &lFixY, &dAngle); ResString rsCapt (ResID (IDS_LONGCLASSNAME, pRF), 50); // dieser Vortest ist eigentlich redundant, aber (vermtl.) durch Rundungsfehler bei der // Berechnung von m_EPt1 und m_EPt2 erscheinen 2 Geraden, die auf der gleichen Bezugslinie // mit dem gleichen Anstieg errichtet werden, nicht immer als parallel sondern mit einem // (allerdings weit drausen liegenden) Schnittpunkt if (RESTRTYPE_KREIS != m_ResType && RESTRTYPE_KREIS != ResType2 && m_dAngle == dAngle && (m_lFixX != lFixX || m_lFixY != lFixY)) { ResString rsText (ResID (IDS_NOSECTPOINT, pRF), 250); MessageBox (__hWndM, rsText.Addr(), rsCapt.Addr(), MB_ICONEXCLAMATION | MB_OK); pPTCur->x = -1; pPTCur->y = -1; return S_FALSE; } if (RESTRTYPE_STRECKE == m_ResType && RESTRTYPE_STRECKE == ResType2) return CursorToSegmentSegment (MSPt, m_EPt1, m_EPt2, EPt12, EPt22, pPTCur); if (RESTRTYPE_STRECKE == m_ResType && RESTRTYPE_GERADE == ResType2) return CursorToSegmentStraight (MSPt, m_EPt1, m_EPt2, EPt12, EPt22, pPTCur); if (RESTRTYPE_STRECKE == m_ResType && RESTRTYPE_KREIS == ResType2) { Point MPt2 = BSKoordinaten (lFixX, lFixY); return CursorToSegmentCircle (MSPt, m_EPt1, m_EPt2, MPt2, iRad2, pPTCur); } if (RESTRTYPE_GERADE == m_ResType && RESTRTYPE_STRECKE == ResType2) return CursorToSegmentStraight (MSPt, EPt12, EPt22, m_EPt1, m_EPt2, pPTCur); if (RESTRTYPE_GERADE == m_ResType && RESTRTYPE_GERADE == ResType2) return CursorToStraightStraight (lParam, m_EPt1, m_EPt2, EPt12, EPt22, pPTCur); if (RESTRTYPE_GERADE == m_ResType && RESTRTYPE_KREIS == ResType2) { Point MPt2 = BSKoordinaten (lFixX, lFixY); return CursorToStraightCircle (MSPt, m_EPt1, m_EPt2, MPt2, iRad2, pPTCur); } if (RESTRTYPE_KREIS == m_ResType && RESTRTYPE_STRECKE == ResType2) { Point MPt1 = BSKoordinaten (m_lFixX, m_lFixY); return CursorToSegmentCircle (MSPt, EPt12, EPt22, MPt1, m_iRad, pPTCur); } if (RESTRTYPE_KREIS == m_ResType && RESTRTYPE_GERADE == ResType2) { Point MPt1 = BSKoordinaten (m_lFixX, m_lFixY); return CursorToStraightCircle (MSPt, EPt12, EPt22, MPt1, m_iRad, pPTCur); } if (RESTRTYPE_KREIS == m_ResType && RESTRTYPE_KREIS == ResType2) { Point MPt1 = BSKoordinaten (m_lFixX, m_lFixY); Point MPt2 = BSKoordinaten (lFixX, lFixY); return CursorToCircleCircle (lParam, MSPt, MPt1, m_iRad, MPt2, iRad2, pPTCur); } _ASSERTE (false); // hierhin dürfte keiner mehr kommen return E_UNEXPECTED; } // CursorTo2RestrictLines
// -------------------------------------------------------------------------------------------- // das Hinzufügen des Stützpunktes erfolgt beim Loslassen der linken Maustaste bool CVertexAdd::LeftMouseUp (LPARAM lParam) { m_pVWnd->MouseTrap (FALSE); CEierUhr Wait (m_pVWnd); // Test, Zeichnen ... kann länger dauern Point newPt = BSPoint (lParam); // BS-Punkt der Mausspitze = neuer Stützpunkt EPunkt NewPkt = DBKoordinaten (newPt); // DB-Koordinaten des neuen Stützpunktes HRESULT hrRet = m_wTopObjs->NewVertexWithGrab ((POINT*)&newPt, NULL, &NewPkt.X(), &NewPkt.Y(), NULL); // die nachfolgenden 2 Befehle müssen VOR ModObjSpeicherung() stehen, da dort // überraschenderweise noch ein MouseMove() dazwischen schlägt if (m_wDragObj.IsValid()) { m_wDragObj->DragTerminate(); m_wDragObj.Assign (NULL); } Rectangle AllRec, Rec; // Bereiche für das Neuzeichnen nach dem Löschen bool bAllRecInit = false; // AllRec (noch) nicht initialisiert WObjektGeometrie wObj; // ObjektGeometrie des lONr-Objektes long lIndn; // ein Stützpunktindex des lONr-Objektes short iOT; // Objekttyp des lONr-Objektes long lIndex; // Rückgabeparameter für IndexTest(); werden IndPos IP; // hier nicht ausgewertet bool bMod = true; // beim Stützpunkt-Hinzufügen keine Probleme (true) ResString resText (ResID (IDS_ADDVERTICES, pRF), 50); DEX_BeginUndoLevel (resText.Addr()); try { WUnknown Unk; for (m_wBelowObjs->Reset(); S_OK == m_wBelowObjs->Next (1, Unk.ppi(), NULL); ) { WObjektGeometrie wObj (Unk); // Indizes lIndn des nachfolgenden Stützpunktes bzgl. des hinzuzufügenden ermitteln HRESULT hr = wObj->GetLineIndex (m_StartPkt.X(), m_StartPkt.Y(), m_lEpsilon, &lIndn); if (S_OK != hr) { bMod = false; continue; } short iKontInd = -1; // nur für Flächenobjekt: Index der Kontur, zu der der neue // Punkt hinzugefügt wird wObj->GetObjTyp (&iOT); if (OT_FLAECHE == iOT) wObj->IndexTest (lIndn, &iKontInd, &lIndex, &IP); hr = wObj->AddPunkt (NewPkt.X(), NewPkt.Y(), lIndn, iKontInd); if (S_OK != hr) { bMod = false; continue; } hr = m_wModClSite->ModObjSpeicherung (wObj, NewPkt.X(), NewPkt.Y(), lIndn, false, VORRUECK, (RECT*)&Rec); // wenn modifiziertes Objekt nicht nach TRiAS gespeichert wird, dann Hinzufügen // rückgängig machen (der 5. Parameter von ModObjSpeicherung() besagt, daß kein // Stützpunkt gelöscht wurde) if (S_OK != hr) { wObj->SubPunkt (lIndn, &iKontInd); bMod = false; } if (!bAllRecInit) { AllRec = Rec; bAllRecInit = true; } else AllRec = AllRec.Union (Rec); } // for } catch (_com_error&) { bMod = false; } if (bMod) // Verschieben ohne Probleme verlaufen DEX_EndUndoLevel(); else DEX_CancelUndoLevel (true); // Ausschnitt nach Geometrie-Modifikation neu zeichnen DEX_RePaintRectWait (AllRec); m_pVWnd->Update(); // sofort zeichnen Wait.Hide(); // ein vorgezogener Quasi-Destruktor für CEierUhr Wait m_wModClSite->RefreshCursorForm(); return bMod; } // LeftMouseUp