Beispiel #1
0
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;
}
Beispiel #2
0
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();
}
Beispiel #3
0
// --------------------------------------------------------------------------------------------
// 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
Beispiel #4
0
// --------------------------------------------------------------------------------------------
// 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
Beispiel #5
0
// --------------------------------------------------------------------------------------------
// 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
Beispiel #6
0
// --------------------------------------------------------------------------------------------
// 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
Beispiel #7
0
// --------------------------------------------------------------------------------------------
// 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