【发布时间】:2019-08-01 00:26:08
【问题描述】:
我有一个代码可以让我画线并限制可以画的线数。
我的问题是我想创建一条线(例如线渲染器) 然后让用户尝试画一条相似(不一定完全相同)的线,代码需要根据设置知道线是否足够相似,但我想不通。
如果有任何提示,我将不胜感激。
public class DrawLine : MonoBehaviour
{
public GameObject linePrefab;
public GameObject currentLine;
public LineRenderer lineRenderer;
public EdgeCollider2D edgeCollider;
public List<Vector2> fingerPositions;
public Button[] answers;
public bool isCurrButtonActive;
int mouseButtonState = 0;
void Update()
{
Debug.Log(rfgrhe);
if (isCurrButtonActive)
{
if (Input.GetMouseButtonDown(0))
{
if (mouseButtonState == 0)
{
CreateLine();
}
}
if (Input.GetMouseButtonUp(0))
{
mouseButtonState++;
}
if (Input.GetMouseButton(0))
{
if (mouseButtonState == 1)
{
Debug.Log(Input.mousePosition.ToString());
if (Input.mousePosition.x < 100 || Input.mousePosition.y > 420 || Input.mousePosition.x > 660 || Input.mousePosition.y < 7)
{
return;
}
Vector2 tempFingerPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
if (Vector2.Distance(tempFingerPos, fingerPositions[fingerPositions.Count - 1]) > .1f)
{
UpdateLine(tempFingerPos);
}
}
}
}
}
void CreateLine()
{
mouseButtonState++;
currentLine = Instantiate(linePrefab, Vector3.zero, Quaternion.identity);
lineRenderer = currentLine.GetComponent<LineRenderer>();
edgeCollider = currentLine.GetComponent<EdgeCollider2D>();
fingerPositions.Clear();
fingerPositions.Add(Camera.main.ScreenToWorldPoint(Input.mousePosition));
fingerPositions.Add(Camera.main.ScreenToWorldPoint(Input.mousePosition));
lineRenderer.SetPosition(0, fingerPositions[0]);
lineRenderer.SetPosition(1, fingerPositions[1]);
edgeCollider.points = fingerPositions.ToArray();
}
void UpdateLine(Vector2 newFingerPos)
{
fingerPositions.Add(newFingerPos);
lineRenderer.positionCount++;
lineRenderer.SetPosition(lineRenderer.positionCount - 1, newFingerPos);
edgeCollider.points = fingerPositions.ToArray();
}
public void ActivateCurrentButton()
{
// Debug.Log(isCurrButtonActive);
isCurrButtonActive = true;
for (int i = 0; i < answers.Length; i++)
{
if (answers[i].CompareTag("onePoint"))
{
answers[i].GetComponent<MapLvl>().isCurrButtonActive = false;
}
else if (answers[i].CompareTag("TwoPoints"))
{
answers[i].GetComponent<DrawLine>().isCurrButtonActive = false;
}
}
}
}
例如,在这种情况下,蓝线是正确的,绿线和红线是用户回答的两个选项。 我想要的是程序只会将绿线确认为正确答案。
【问题讨论】:
-
我认为您必须弄清楚在您的应用程序上下文中“足够相似”对您意味着什么。也许拿你的源线,缓冲 20 像素,如果输入线完全在缓冲区内并穿过一些控制点,那很好;或者用一些算法简化你的源代码行并对其进行哈希处理,然后以类似的方式简化输入行并比较哈希值。您将不得不决定一种方法并尝试它,然后才能获得有关堆栈溢出的有意义的帮助
-
您能否详细说明一下,您想比较什么样的“线条”?你的意思是数学二维线?在这种情况下,您可以标准化您的线条并获得点积 - 它会为您提供“垂直度”的度量。但是,当您实际上是指“曲线”时,这并不容易。