o
    oi                     @   s   d dl mZ d dlZd dlmZmZmZmZ d dlm	Z	m
Z
mZ d dlmZmZ d dlmZ d dlmZmZ d dlmZ d	d
gZddededefddZG dd	 d	eZdedefdd
ZdS )    )OptionalN)ModuleTensorstackwhere)KORNIA_CHECKKORNIA_CHECK_SHAPEKORNIA_CHECK_TYPE)unwrapwrap)batched_dot_product)ScalarVector3)_torch_svd_cast
Hyperplane	fit_planeư>vepsreturnc                 C   s"   | |  j ddd| }| |  S )NT)dimkeepdim)sumrsqrt)r   r   norm_sq r   I/home/ubuntu/.local/lib/python3.10/site-packages/kornia/geometry/plane.py
normalized#   s   r   c                
       s   e Zd Zdededdf fddZdefddZdefd	d
Ze	defddZ
e	defddZdedefddZdedefddZdedefddZedededd fddZeddededee dd fddZ  ZS )r   ndr   Nc                    s.   t    t|t t|t || _|| _d S N)super__init__r	   r   r   _n_d)selfr   r    	__class__r   r   r#   )   s
   



zHyperplane.__init__c                 C   s   d| j  d| j S )NzNormal: z	
Offset: )normaloffsetr&   r   r   r   __str__3   s   zHyperplane.__str__c                 C   s   t | S r!   )strr+   r   r   r   __repr__6   s   zHyperplane.__repr__c                 C      | j S r!   )r$   r+   r   r   r   r)   9      zHyperplane.normalc                 C   r/   r!   )r%   r+   r   r   r   r*   =   r0   zHyperplane.offsetpc                 C   s   t | | S r!   )r   signed_distanceabsr&   r1   r   r   r   abs_distanceA   s   zHyperplane.abs_distancec                 C   s$   t t|ttf | j|| j S r!   )r   
isinstancer   r   r)   dotr*   r4   r   r   r   r2   F   s   zHyperplane.signed_distancec                 C   s6   |  |}t|jt| jkr|d }||j| j  S )N).N)r2   lenshaper)   data)r&   r1   distr   r   r   
projectionL   s   
zHyperplane.projectionec                 C   s   |}| | }t|t|S r!   )r7   r   r   )r&   r   r=   r)   r*   r   r   r   from_vectorV   s   zHyperplane.from_vectorp0p1p2c                 C   s   |d u r*t |ddg t|j|jk t|| }t|| }tt|tt|tS t |ddg t|j|jk t|j|jk || || }}t	j
j||dd}|d}	dtdtdd	fd
d}
|	|d|d d k}t||
||j||	d  }t|| }tt|tt|tS )N*23r   )r   v0v1r   r   c                 S   s<   t t| t|fd}t|\}}}t|dd d df tS )N.r   )r   r
   r   r   r   )rE   rF   m_Vr   r   r   compute_normal_svdp   s   z.Hyperplane.through.<locals>.compute_normal_svdr   )r   r   r9   r   r   r   r   r   r   torchlinalgcrossnormr   r   r:   )clsr?   r@   rA   normal2doffset2drE   rF   r)   rO   rK   normal_maskr*   r   r   r   through\   s"   
zHyperplane.throughr!   )__name__
__module____qualname__r   r   r#   r-   r,   r.   propertyr)   r*   r5   r2   r<   classmethodr>   r   r   rT   __classcell__r   r   r'   r   r   (   s    

*pointsc                 C   sp   | j d dkrtd| dd}| | }t|\}}}|ddddf }|ddddf }tt|t|S )	zFit a plane from a set of points using SVD.

    Args:
        points: tensor containing a batch of sets of n-dimensional points. The  expected
            shape of the tensor is :math:`(N, D)`.

    Return:
        The computed hyperplane object.

    r      zvector must be (*, 3)rG   T.Nr   )r9   	TypeErrormeanr   r   r>   r   )r[   r^   points_centeredrI   rJ   	directionoriginr   r   r   r      s   )r   )typingr   rL   kornia.corer   r   r   r   kornia.core.checkr   r   r	   kornia.core.tensor_wrapperr
   r   kornia.geometry.linalgr   kornia.geometry.vectorr   r   kornia.utils.helpersr   __all__floatr   r   r   r   r   r   r   <module>   s   W